关闭查询表达式

时间:2011-11-09 17:42:57

标签: c# closures expression

我有一个查询表达式,它接受一个字符串数组,应该生成一个查询,根据查询返回一些项目。但是,它不返回任何东西。我认为有一个关闭问题,但我不确定它是什么。

        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会导致返回每个项目(甚至那些不包含任何查询字符串的项目)。关于问题可能隐藏的任何想法?

2 个答案:

答案 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,您应该显示更多代码,以便我们知道问题所在。