이 같은 엔티티를 가지고 :LINQ PredicateBuilder 여러 OR PredicateBuilder.True로 시작하는 <>
public class Product()
{
public string Name { get; set; }
}
나는 그들이 OR로하고 있도록 Name
재산에 키워드에 대한 검색을 구현하려는. 즉, 검색 :
숟가락 나이프 포크
는 숟가락또는나이프 Name
속성또는포크를 검색합니다. 나는이처럼 보이는 Product
에 PredicateBuilder
하기위한 새로운 방법을 소개 :
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
을 처리하고 싶습니다.
네, 그게 가장 좋습니다. 그러나 그는 특별히 목록이 비어 있는지 확인하지 않고 방법을 요청했습니다. – Jacob
글쎄, 최선을 다하고 싶습니다. 나는'if (! keywords.Any())가 PredicateBuilder.True()'을 반환했지만 거기에 다른 해결책이 있는지보고 싶었습니다. –
이 최적인데 빈 배열을 검사하는 데 문제가 있습니까? –