在具有多个Where语句的循环中过滤IQueryable

时间:2011-05-23 11:43:20

标签: c# linq

我有这个代码

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 of Persoon(来自数据库)和一个过滤器列表。

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

当我首先进入循环时,在我第一次进入循环之后(在leeftijd所在位置)之后,我看到tmp有3个对象。然后代码在循环中第二次进入,进入第一个If(其中filter eq naam)并且在那里,当我查看tmp时,它只有0个对象。

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

但是现在我发现,即使在我做第二次之前,临时也是空的。

我做错了什么?

1 个答案:

答案 0 :(得分:8)

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;

}

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