我有一个查询表达式,它接受一个字符串数组,应该生成一个查询,根据查询返回一些项目。但是,它不返回任何东西。我认为有一个关闭问题,但我不确定它是什么。
public static Expression<Func<Item, bool>> IsKnownByIn(string[] query )
{
var i = PredicateBuilder.True<Item>();
foreach (string keyword in query)
{
string temp = keyword;
i = i.And(p=> p.Name.Contains(temp) || p.ID.ToString().Contains(temp));
}
return i;
}
我尝试用.Contains(关键字)替换.Contains(temp),导致只返回查询中的最后一个字符串。此外,用i.Or替换i.And会导致返回每个项目(甚至那些不包含任何查询字符串的项目)。关于问题可能隐藏的任何想法?
答案 0 :(得分:1)
当你尝试Or时,你得到了所有这些,因为你从true开始,即
是真或某事或某事
永远是真的。将i的结构改为False。
在您提供的代码中,使用PredicateBuilder并在循环内构建时,为temp分配关键字是正确的方法。
编辑:
根据您对我的问题的回答,我会这样做:
public static Expression<Func<Item, bool>> IsKnownByIn(string[] query )
{
var i = PredicateBuilder.False<Item>();
foreach (string keyword in query)
{
string temp = keyword;
i = i.Or(p=> p.Name.Contains(temp) || p.ID.ToString().Contains(temp));
}
return i;
}
答案 1 :(得分:1)
那么您是否在查询中指定了所有关键字的项目?这些应该是唯一可以通过过滤器的。也许你应该使用Or代替。或者你看过的问题可能是因为你从PredicateBuilder.True开始,所以'true或expr1或expr2 ... exprn'将永远产生真。如果您使用过PredicateBuilder.False,您应该显示更多代码,以便我们知道问题所在。