うまく機能する非常に単純な述語ビルダー クエリがあります。検索するキーワードのリストがあり、それらのキーワードをループして、オブジェクト プロパティのいずれかが一致するかどうかを確認します。
var predicateSearchText = PredicateBuilder.False<Asset>();
List<string> separatedKeywords = keywords.Split(',').ToList();
foreach (string s in separatedKeywords)
{
if (s.Length > 0)
{
string temp = s;
predicateSearchText = predicateSearchText.Or(m => m.Notes.Contains(temp));
predicateSearchText = predicateSearchText.Or(m => m.Description.Contains(temp));
predicateSearchText = predicateSearchText.Or(m => m.DetailedDescription.Contains(temp));
predicateSearchText = predicateSearchText.Or(asset => asset.Keywords.Contains(temp));
predicateSearchText = predicateSearchText.Or(a => a.AssetFiles.Any(x => x.FileName.Contains(temp)));
}
}
...さらに下に私はします:
var query = (from a in masterQuery.Where(predicateSearchText);
そして、必要なものを取得します。検索したキーワードを持つものだけにフィルターをかけます。
エンティティの特定のプロパティ内のすべてのキーワードを検索するように、これを変更する必要があります。したがって、「メモ」フィールドには検索対象の各キーワードが含まれている必要があります。または、「説明」フィールドには検索対象のすべてのキーワードが含まれている必要があります。これには内部/外部述語が関係していると思いますが、思いつきませんでした。私が試した結果が多すぎます。結果は 1 つしかないはずです... 他のエンティティは条件に一致しません。私の問題は明らかですか?私のキーワード (そのうちの 6 つ) は非常にユニークです。
var predicateSearchText = PredicateBuilder.False<Asset>();
var notesPred = PredicateBuilder.True<Asset>();
var descPred = PredicateBuilder.True<Asset>();
var detdescPred = PredicateBuilder.True<Asset>();
var keywordPred = PredicateBuilder.True<Asset>();
var filesPred = PredicateBuilder.True<Asset>();
foreach (string s in separatedKeywords.Where(xx=>xx.Length > 0))
descPred.And(m => m.Description.Contains(s));
foreach (string s in separatedKeywords.Where(xx => xx.Length > 0))
notesPred.And(m => m.Notes.Contains(s));
foreach (string s in separatedKeywords.Where(xx => xx.Length > 0))
detdescPred.And(m => m.DetailedDescription.Contains(s));
foreach (string s in separatedKeywords.Where(xx => xx.Length > 0))
keywordPred.And(m => m.Keywords.Contains(s));
foreach (string s in separatedKeywords.Where(xx => xx.Length > 0))
filesPred.And(a => a.AssetFiles.Any(x => x.FileName.Contains(s)));
predicateSearchText = predicateSearchText.Or(notesPred.Expand());
predicateSearchText = predicateSearchText.Or(descPred.Expand());
predicateSearchText = predicateSearchText.Or(detdescPred.Expand());
predicateSearchText = predicateSearchText.Or(keywordPred.Expand());
predicateSearchText = predicateSearchText.Or(filesPred.Expand());
次に、次のことを行います。
var query = (from a in masterQuery.Where(predicateSearchText);
そして、述語を正しくするにはあまりにも多くの結果が得られます。