2009-10-30 7 views
2

많은 비트 열이있는 제품 정보 테이블이 있습니다. 이 테이블은 각 열의 체크 박스가있는 인터페이스에서 쿼리 할 수 ​​있습니다. 확인란은 여러 관련 그룹으로 그룹화됩니다.Linq 쿼리에서 WHERE 절 제거

예를 들어, 세 개의 열은 Automotive, Aviation 및 Marine과 같이 다양한 시장에서 제품 적합성을 나타냅니다.

이 체크 박스 중 어느 것도 선택하지 않으면 다음 SQL이 실행되기를 바랍니다.

SELECT * FROM Products 

자동차는 다음과 같은 SQL이

SELECT * FROM Products WHERE Automotive = 1 

을 실행해야 하나 이상의이 선택되어 있다면이 옵션에서 함께

SELECT * FROM Products WHERE 
    Automotive = 1 
    OR 
    Aviation = 1 

을 OR 될 싶습니다 확인 된 경우 좋은 옛날 C# & SQL 조건부로 SQL을 연결하여이 논리를 얻을 수는 있지만 Linq와 동일한 논리를 생성하는 데 문제가 있습니다.

내 문제는 조건부로 WHERE 절과 그 요소를 내 쿼리에 추가하는 방법입니다.

쿼리가 실행되는 지점을 하나만 갖고 싶다면이 다른 쿼리로 분기하려면 가능한 한 C# 을 사용하지 않는 것이 좋습니다.

+0

http://stackoverflow.com/questions/1450983/linq2sql-or-and-operators-anded-ored-conditions –

답변

6

이 경우 PredicateBuilder을 사용합니다.

var query = db.GetTable<Products>().AsQueryable(); 

var predicate = PredicateBuilder.False<Products>(); 
if (automotive.Checked) 
{ 
    predicate = predicate.Or(p => p.Automotive == 1); 
} 
if (aviation.Checked) 
{ 
    predicate = predicate.Or(p => p.Aviation == 1); 
} 
query = query.Where(predicate); 
+1

+1에 대한 aw30omen –

+0

바로! 이 PredicateBuilder는 매끄 럽습니다! –

3

값을 "Or"대 "And"로 설정하면이 문제가 좀 더 어려워집니다. 가 있다면 "그리고"그 다음은되고 그와 잘

public IEnumerable<Products> GetQuery() { 
    var query = db.GetTable<Products>(); 
    if (automotiveBox.Checked) { 
    query = query.Where(x => x.Automotive == 1); 
    } 
    if (aviation.Checked) { 
    query = query.Where(x => x.Aviation == 1); 
    } 
    return query 
} 

을해야에 "또는"나는 당신의 유일한 옵션은 손으로 표현 트리를 구축하고 Where 절로 사용하는 것입니다 생각하지만.

+0

"Or"의 경우이 기능이 작동하지 않습니까? 나는 여러 개의 Where 조건이 생성 된 SQL의 단일 Where 절에 간단하게 결합 될 것이라고 믿습니다. http://stackoverflow.com/questions/1280871/multiple-defered-where-clause-expressions-in-linq-to-sql이 문제를 뒷받침하는 것으로 보입니다. –

+1

예, 생성 된 SQL에 "AND"대/소문자를 사용합니다. 당신은 효과적으로 A와 AND를 어디서하고 있는지, 그리고 어디서 C가 아닌지 (A OR B OR C), 다른 스타일의 SQL 문이 필요하기 때문입니다. –

3

단일 열을 검사하는 함께 "OR"문을 사용하려는 경우 Contains을 사용하여이를 수행 할 수 있습니다. 이것이 작동하는 방법을 보여주는 good blog post이 있습니다.

그러나 동적으로 다른 열을 확인하려는 경우에는 작동하지 않습니다. 이 경우 여러 문장이 필요할 것입니다.