Кажется, что есть порядок или тому подобное, чтобы присоединиться к внутреннему фильтру.Давайте возьмем этот код как исходный из моего 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: сложный расширенный поиск с пунктом «Динамическое где» , я изменил свой код.
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;
}
И он работает безупречно!Я не очень понимаю, почему результаты идеальны только потому, что порядок фильтров влияет на результаты, и это сработало для меня.