2017-12-10 29 views
0

내가 Asp.net 웹 응용 프로그램 일하고, 나는에서 TFS로 쿼리 평가를 설계하는 요구 사항이 있습니다TFS와 같은 C#에서 쿼리 평가를 디자인하는 방법은 무엇입니까?

ConditionGroups table

:

Tfs queries

내가이 테이블 스키마와 함께 온을

이제는 각 표현식을 평가하고 그 값을 Order 열에 따라 다음 표현식의 값과 결합하여 true/false 값을 얻기 위해 해당 표현식을 평가할 계획입니다.

C#을 사용하여 구현하는 더 좋은 방법이 있는지 알려주시겠습니까?

그리고 내 접근 방식 C# 식 라이브러리를 사용하여 동적 식을 작성하는 방법?

+0

조언 : 'AND'연산자와 'OR'연산자를 결합 할 때주의하십시오. 어떤 종류의 브래킷 시스템을 만들어야합니다. "r AND s OR t AND u v"와 같은 조건이있을 때 어떤 조건이 'AND'또는 'OR'을 통해 함께 연결되어야하는지 명확하지 않습니다. 'order' 필드는이 문제를 해결할 수 없습니다. – Progman

+0

@Progman하지만 각 조건을 평가하면 문제가되지 않을 것이라고 다음 조건으로 평가했습니다. true || false = true 그런 다음 세 번째 조건이있는 처음 두 조건에서 얻은 값 true && false = false –

+2

C#'Expression's을 사용하여 이와 같은 동적 조건을 만들 수 있습니다. 보너스로 Entity Framework와 같은 것을 사용하고 있다면 데이터베이스 쿼리에도 이러한 조건이 적용됩니다. 그 질문이 보류되지 않았다면 나는 그 예를 제시 할 수 있었다. – Evk

답변

1

편집 : 임의의 클래스 또는 하나의 fooClass에 대해 필터링을 수행 할 수 있어야합니까? 후자의 경우 필터링 가능한 모든 클래스가 간단한 인터페이스를 구현하고 필터링을 위해 액세스 할 수 있습니다. 예를 들어, 당신은 내가 외부 클래스에서 필터를 구현하고있어이 예에서이

public interface IFilterableByFlags<T> 
{ 
    Dictionary<string, Func<T, bool, bool>> GetFilters(); 
    IEnumerable<T> ApplyFilters(IEnumerable<T> collection, Dictionary<string, bool> filterValues); 
} 

public class FooFilters : IFilterableByFlags<fooClass> 
{ 
    public Dictionary<string, Func<fooClasss, bool, bool>> GetFilters() 
    { 
    var filters = new Dictionary<string, Func<fooClass, bool, bool>>(); 
    filters["AdminAccess"] = (obj, val) => obj.AdminAccess == val; 
    filters["ChildRestrictions"] = (obj, val) => obj.ChildRestrictions == val; 
    return filters; 
    } 

    public IEnumerable<fooClass> ApplyFilters(IEnumerable<fooClass> collection, Dictionary<string, bool> filterValues) 
    { 
    var filters = GetFilters(); 

    // this could be written using Linq Aggregate, but I prefer an 
    // explicit loop. Simpler error handling (omitted here for brevity) 
    foreach(var f in filtervalues) 
    { 
     collection = collection.Where(foo => filters[f.Key](foo, f.Value)); 
    } 

    return collection; 
    } 
} 

뭔가를 할 수 있지만, 하나는 쉽게 맞게이 코드를 혼합하고 일치하는 필터를 통합 할 fooClass을 확장 할 수 귀하 이 코드는 비 - 불린 (non-boolean) 필터를 지원하도록 쉽게 확장 될 수 있습니다.

+0

할 일은 쿼리 그룹을 저장하는 것입니다. 그러면 데이터베이스에서 특정 엔터티를 확인하여 지정된 쿼리를 만족하는 레코드를 확인합니다. –

+0

동적 쿼리를 추가해야하므로 나중에 특정 엔터티가 특정 쿼리를 충족했는지 확인할 수 있습니다 특정 사용자가 추가 한 파일 –

+0

@SimpleCode great, 그래서이 필터를 사용하면 이러한 불리언 수 있습니까? –