2011-11-20 7 views
1

튜플을 기반으로 where 절을 "조정"하는 단일 쿼리를 만들고 싶습니다. 튜플의 첫 번째 항목에는 필터링 할 필드를 나타내는 열거 형 값이 들어 있습니다. 두 번째 튜플 항목은 필터 값입니다.LINQ to SQL 쿼리 Where 절

공지 사항 아래 쿼리가 작동하지 않습니다

 var query = from p in db.Categories 
     where (QueryBy.Item1 == CategoryFields.Name  && p.Name  == (string)(QueryBy.Item2)) || 
       (QueryBy.Item1 == CategoryFields.Id   && p.Id   == (long)(QueryBy.Item2) ) || 
       (QueryBy.Item1 == CategoryFields.Description && p.Description == (string)(QueryBy.Item2)) || 
       (QueryBy.Item1 == CategoryFields.SortOrder && p.SortOrder == (int)(QueryBy.Item2) ) 
     select... 

     if (query.Count() == 1) // ERRORS HERE CONVERSION OF INT 

유사한 쿼리 만이 함께 절 변화가 작품 곳 :

 var query = from p in db.Categories 
     where (QueryBy.Item1 == CategoryFields.Name  && p.Name  == (string)(QueryBy.Item2)) 
     select... 

     if (query.Count() == 1) // Works HERE 

어떤 생각이 무엇이 잘못 될 수 있을까? LINQ where 절이 단락 평가를 수행하여 item2의 캐스트가 실패 할 수 있습니까? where 절을 조정하는 전반적인 목표를 달성하는 더 좋은 방법이 있습니까?

미리 도움 주셔서 감사합니다.

답변

3

LINQ to SQL은 사용자의 쿼리를 최적화하고 의 값을 기반으로 동적으로 생성 할만큼 똑똑하지 않습니다. SQL 쿼리를 생성하여 SQL 서버가 스스로 결정할 수 있도록합니다.

하나의 단일 값을 int, longstring 모두에 캐스팅 할 수 없기 때문에 오류를 이해하는 것이 좋습니다.

귀하의 경우에는 where 절을 동적으로 생성하는 것이 좋습니다. PredicateBuilder :

IQueryable<Category> query = db.Categories; 

var whereClause = PredicateBuilder.False<Category>(); 

switch (QueryBy.Item1) 
{ 
    case CategoryFields.Name: 
     long id = (string)QueryBy.Item2; 
     whereClause = whereClause.Or(p => p.Name == name); 
     break; 

    case CategoryFields.Id: 
     string name = (string)QueryBy.Item2; 
     whereClause = whereClause.Or(p => p.Id == id); 
     break; 

    case CategoryFields.Description: 
     string des = (string)QueryBy.Item2; 
     whereClause = 
      whereClause.Or(p => p.Description == des); 
     break; 

    case CategoryFields.Id: 
     string sort = (int)QueryBy.Item2; 
     whereClause = 
      whereClause.Or(p => p.SortOrder == sort); 
     break; 
} 

query = query.Where(whereClause); 
+0

감사합니다. Steven! 이것은 하나의 변경으로 작동합니다. 마지막 줄은 "query = query.Where (whereClause);"입니다. 쿼리를 필터링하는 것 같습니다. 그래서 switch 문을 쿼리에 대해 이동하고 쿼리를 다음과 같이 변경했습니다. "IQueryable query = (db.Categories ...). where (whereClause);" –