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

我也得到太謂詞的許多結果是正確的。

回答

0

今天我有同樣的問題。在循環內部移動PredicateBuilder實例化和Where()函數,並且它將有效地與單獨關鍵字謂詞進行AND。

var predicateSearchText; 
List<string> separatedKeywords = keywords.Split(',').ToList(); 

foreach (string s in separatedKeywords) 
{ 
    if (s.Length > 0) 
    { 
     predicateSearchText = PredicateBuilder.False<Asset>(); 

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

     Query = Query.AsExpandable().Where(predicateSearchText); 
    } 
}