【问题标题】:filter IQueryable in a loop with multiple Where statements在具有多个 Where 语句的循环中过滤 IQueryable
【发布时间】:2011-05-23 11:43:20
【问题描述】:

我有这个代码

private static IQueryable<Persoon> Filter(IQueryable<Persoon> qF, IDictionary<string, string> filter)
{
    IQueryable<Persoon> temp;
    temp = qF;
    foreach (var key in filter)
    {
        if (key.Key == "naam")
        {
            temp = temp.Where(f => f.Naam == key.Value);
        }
        else if (key.Key == "leeftijd")
        {
            temp = temp.Where(af => af.Leeftijd != null && af.Leeftijd.AantalJaarOud.ToString() == key.Value);
        }
    }
    return temp;

}

它的作用(它是一个用于测试行为的简化版本)是你给这个函数一个 IQueryable 的 Persoon(来自数据库)和一个过滤器列表。

所以你给过滤器 naam,john 和 leeftijd,30 你会得到所有名为 John 和 Age 30 的 Persoon objecten。

当我首先进入循环时,就在我在它之后的 } 处执行第一个 where(leftijd where)之后,我看到 tmp 有 3 个对象。然后代码在循环中第二次进入,进入第一个 If (where filter eq naam) 并在那里,当我查看 tmp 时,它只有 0 个对象。

它不起作用的第一个观点是,该函数不返回任何结果(应该是 2:3 30 和 2 约翰)。所以我得出的结论是多重。问题出在哪里。

但现在我发现 temp 是空的,甚至在我做第二个 where 之前。

我做错了什么?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    LINQ 的 lambda 表达式使用后期参数绑定,因此当最终处理 xpression 时,变量“key”不再指向正确的值。

    尝试更改代码以将密钥存储在局部变量中并改用它:

    private static IQueryable<Persoon> Filter(IQueryable<Persoon> qF, IDictionary<string, string> filter)
    {
        IQueryable<Persoon> temp;
        temp = qF;
        foreach (var key in filter)
        {
            var currentKeyValue = key.Value;
            if (key.Key == "naam")
            {
                temp = temp.Where(f => f.Naam == currentKeyValue);
            }
            else if (key.Key == "leeftijd")
            {
                temp = temp.Where(af => af.Leeftijd != null && af.Leeftijd.AantalJaarOud == Int32.Parse(currentKeyValue));
            }
        }
        return temp;
    
    }
    

    我认为你应该改变的另一件事是将年龄字段转换为字符串而不是相反的方向。因此数据库比较的是数字而不是字符串。

    【讨论】:

    • 你的意思是:当我迭代 20 次时,所有 WHERE 都指向同一个(最新)键,而其他 19 个被忽略?
    • 正是如此。我也一直忘记它,并不断遇到这样的错误。
    • 我遇到了类似的问题,就是这样。谢谢!
    猜你喜欢
    • 2016-10-02
    • 2021-07-19
    • 2013-10-29
    • 2013-06-28
    • 2020-12-13
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多