2011-02-02 3 views
4

이 같은 엔티티를 가지고 :LINQ PredicateBuilder 여러 OR PredicateBuilder.True로 시작하는 <>

public class Product() 
{ 
    public string Name { get; set; } 
} 

나는 그들이 OR로하고 있도록 Name 재산에 키워드에 대한 검색을 구현하려는. 즉, 검색 :

숟가락 나이프 포크

숟가락또는나이프 Name 속성또는포크를 검색합니다. 나는이처럼 보이는 ProductPredicateBuilder하기위한 새로운 방법을 소개 :

public static Expression<Func<Product, bool>> ContainsKeywords(params string[] keywords) 
{ 
    var predicate = PredicateBuilder.True<Product>(); 

    foreach (var keyword in keywords) 
    { 
     var temp = keyword; 
     predicate = predicate.Or(x => x.Name.Contains(temp)); 
    } 

    return predicate; 
} 

그리고 웹 서비스에 대한 내 방법 중 하나에서 이런 식으로 사용하고 있습니다

var keywords = Request.QueryString["q"].Split(' '); 
var products = Repo.GetAll<Product>(); // get all the products from the DB 
products = products.Where(Product.ContainsKeywords(keywords)); 

나 '의 문제 나는 키워드 검색을하지 않기로 결정할 수도 있는데,이 경우 keywords 배열은 비어있게된다. PredicateBuilder.True<Product>()으로 시작하면 입력 한 키워드에 관계없이 Products의 목록을 얻습니다. PredicateBuilder.False<Product>()으로 시작하면 사용자가 키워드를 입력하면 작동하지만 그렇지 않은 경우 모든 것이 일치하므로 반환 목록이 비어 있습니다 false .

키워드가 제공되지 않은 경우 모두 Products의 목록을 반환하고 제공된 키워드와 일치하는 Products 만 목록을 반환하여 원하는 동작을 얻으려면 어떻게 수정해야합니까? 나는 모든 처리를하기 전에 키워드 배열이 비어 있는지 확인하기 위해 검사를 수행 할 수 있지만 가능하다면이 경우 자동으로 PredicateBuilder을 처리하고 싶습니다.

답변

2
var predicate = (keywords.Count() > 0) 
    ? PredicateBuilder.False<Product>() 
    : PredicateBuilder.True<Product>(); 
+0

네, 그게 가장 좋습니다. 그러나 그는 특별히 목록이 비어 있는지 확인하지 않고 방법을 요청했습니다. – Jacob

+0

글쎄, 최선을 다하고 싶습니다. 나는'if (! keywords.Any())가 PredicateBuilder.True ()'을 반환했지만 거기에 다른 해결책이 있는지보고 싶었습니다. –

+0

이 최적인데 빈 배열을 검사하는 데 문제가 있습니까? –