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

Mic*_*hel 4 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;

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

但是现在我看到,即使我做第二次,温度也是空的.

我究竟做错了什么?

Var*_*ant 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;

}
Run Code Online (Sandbox Code Playgroud)

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