2
我有一個非常簡單的謂詞構建器查詢,效果很好。我們有一個要搜索的關鍵字列表,我們通過這些關鍵字循環查看是否有任何對象屬性匹配。Predicatebuilder組和或內部外部查詢
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);
和我得到了我所需要的 - 過濾器,只有那些與我搜索過其中的關鍵字。
我需要改變它,以便在我的實體的某個屬性內查找所有關鍵字。因此「筆記」字段必須搜索每個關鍵字,或者,「描述」字段必須搜索所有關鍵字。我認爲這涉及到內部/外部謂詞,但是我還沒有能夠想出它。我試過的東西給了我太多的結果,它應該只給我一個......其他實體不符合標準。我的問題明顯嗎?我的關鍵字(其中6)是非常獨特的,我恢復了600項,而不是1 ...
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);
我也得到太謂詞的許多結果是正確的。