2012-09-24 2 views
0

나는 키 이름으로 열 이름을 포함하는 사전 Dictionary<string, List<string>> FilterDictionary을 가지고 있으며 그 키의 값은 where 절로 사용될 기준 목록입니다.Linq to sql multiple columns

내 데이터베이스를 쿼리해야하고 사전에있는 각 열에 대해 해당 키 목록의 조건과 해당 열을 쿼리해야합니다.

이 작업을 수행하는 가장 좋은 방법은 무엇일까요?

이것은 내가 달성하고 싶지만 명백하게는 columnName == filterCriteria처럼 단순하지 않다는 것을 알고 있습니다.

var originalQuery = from p in productContext.Products 
        select p; 
foreach (var item in FilterDictionary) 
{ 
    string columnName = item.Key; 

    foreach (var filterCriteria in FilterDictionary) 
    { 
     originalQuery.Where(columnName == filterCriteria); 
    } 
} 
+1

'Expression >'컬렉션을 사용하지 않거나 사용할 수없는 이유가 있습니까? – Yuck

+0

단순히 ive가 이전에 그렇게하지 않았기 때문입니다. 그게 가장 좋은 길이라고 말할 수 있겠 니? – lnelson92

+0

나는 그렇게 말하고 싶다. 내 대답을 보라. 이런 식으로 강력한 타이핑 및 컴파일 타임 안전성을 얻을 수 있습니다. 또한 필터 조건을 작성하는 동안 IntelliSense를 사용할 수 있습니다. – Yuck

답변

1

내가 대신 필터 조건의 컬렉션 개최 같은 것을 할 것 다음 foreach 루프의 끝에서

var filters = new List<Expression<Func<Product, Boolean>>>(); 
filters.Add(e => e.Name == "some name"); 

var originalQuery = from p in productContext.Products 
        select p; 
originalQuery = filters 
    .Aggregate(originalQuery, (current, condition) => current.Where(condition)); 

originalQuery 함께 개최 조건을 모두 논리적으로 AND 에드있을 것이다 filters.

+0

수정 된 클로저가 붙은 시계를보십시오! (in-loop 변수에서'filter '캡처) –

+0

@GertArnold 오른쪽 - 대신 LINQ 집계를 사용하여 코드를 더 읽기 쉽게 만들 수 있습니다. – Yuck

+0

참, 개념 안에있어 라! –