查询表达式的闭包

本文关键字:闭包 表达式 查询表 查询 | 更新日期: 2023-09-27 18:14:12

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

        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会导致返回每个项(甚至那些不包含query中的任何字符串的项)。你知道问题可能隐藏在哪里吗?

查询表达式的闭包

当你尝试Or时,你得到了它们,因为你以true开始,即

true or something or something

总是为真。将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;

}

那么您是否有在查询中指定了所有关键字的项?这些应该是唯一可以通过过滤器的。也许,你应该用Or代替。Or的问题可能是因为您从PredicateBuilder开始。True,所以是True或expr1或expr2…exp永远是true。如果你用过PredicateBuilder。

你应该显示更多的代码,这样我们才能知道是什么问题。