gpt4 book ai didi

c# - Predicatebuilder group and or queries with inner outer

转载 作者:太空宇宙 更新时间:2023-11-03 16:15:13 25 4
gpt4 key购买 nike

我有一个非常简单的谓词生成器查询,效果很好。我们有一个要搜索的关键字列表,我们遍历这些关键字以查看是否有任何对象属性匹配。

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

而且我得到的结果太多以至于谓词不正确。

最佳答案

我今天遇到了同样的问题。将 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);
}
}

关于c# - Predicatebuilder group and or queries with inner outer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15980789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com