好像有一個命令或像加入內部過濾器一樣。讓我們把這個代碼作爲我的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查詢將只接受兩個且只有兩個和強制性的兩個關鍵字。我將無法提供多於或少於兩個關鍵字。這是我希望避免並使之動態的。 =) –
+1給它一個鏡頭。 –