보인다 the-like 내부 필터를 결합하십시오. 이 코드를 내 CreateFilter
메소드의 머리 글자로 사용합니다.
private Expression<Func<CompanyInfo, bool>>
CreateFilter(SearchCriterion criterion) {
var outerFilter = PredicateBuilder.True<CompanyInfo>();
outerFilter = outerFilter.And(ci => !ci.IsDeleted && ci.IsBindingApproved);
var innerFilter = PredicateBuilder.False<CompanyInfo>();
foreach(var keyword in criterion.Keywords) {
var w = keyword;
innerFilter = innerFilter.Or(ci => ci.Name.Contains(w)
|| ci.CityName.Contains(w))
}
outerFilter = outerFilter.And(innerFilter);
if (criterion.HasCityName)
outerFilter = outerFilter.And(ci =>
ci.CityName.Contains(criterion.CityName));
// Other similar filter here...
return outerFilter;
}
이것은 올바른 결과를 반환하지 못했습니다. 그런 다음이 기사에 따라 : LINQ: Complicated Advanced Search with Dynamic Where Clause, 내 코드가 변경되었습니다.
private Expression<Func<CompanyInfo, bool>>
CreateFilter(SearchCriterion criterion) {
var innerFilter = PredicateBuilder.False<CompanyInfo>();
foreach(var keyword in criterion.Keywords) {
var w = keyword;
innerFilter = innerFilter.Or(ci => ci.Name.Contains(w)
|| ci.CityName.Contains(w))
}
var outerFilter = PredicateBuilder.True<CompanyInfo>();
outerFilter = outerFilter.And(ci => !ci.IsDeleted && ci.IsBindingApproved);
if (criterion.HasCityName)
outerFilter = outerFilter.And(ci =>
ci.CityName.Contains(criterion.CityName));
// Other similar filter here...
// Here, we want to include the filter on keywords only when there are
// some provided with the search.
// Otherwise, the result of the And(innerFilter) with no keywords
// will always be 'false' and return no results though other criterion
// might be met such as the CityName and whatever the others are.
if (criterion.HasKeywords) outerFilter = outerFilter.And(innerFilter);
return outerFilter;
}
그리고 완벽하게 작동합니다. 나는 결과가 필터의 순서가 결과에 영향을주는 것처럼 보이는 이유를 이해하지 못한다.
나를 도와 주셔서 감사합니다. =) 제쳐두고, 나는 여전히 같은 문제가 붙어 있는데,이 Linq 질의는 오직 2 개와 2 개의 필수 키워드만을 받아 들일 것입니다. 두 개 이상의 키워드를 제공 할 수 없습니다. 그것이 내가 피하고 싶고 역동적으로 만들고자하는 바입니다. =) –
+1. –