2

うまく機能する非常に単純な述語ビルダー クエリがあります。検索するキーワードのリストがあり、それらのキーワードをループして、オブジェクト プロパティのいずれかが一致するかどうかを確認します。

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);

そして、述語を正しくするにはあまりにも多くの結果が得られます。

4

1 に答える 1