に思えます内部フィルタを結合するようなものです。このコードを私の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つの義務的な2つのキーワードしか受け入れません。私は2つ以上のキーワードを提供することはできません。それは私が避けたい、そしてダイナミックにしたいものです。 =) –
+1それはショットを与える。 –