在具有多个Where语句的循环中筛选IQueryable

本文关键字:循环 筛选 IQueryable 语句 Where | 更新日期: 2023-09-27 17:57:30

我有这个代码

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;
}

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

所以你给过滤器naam,john和leefttijd,30,你会得到所有名为john和Age 30的Persoon对象。

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

它不起作用的第一种观点是,函数没有返回任何结果(应该是2:30和其中的2个Johns)。所以我得出结论,倍数。问题出在哪里。

但现在我看到温度是空的,甚至在我做第二个地方之前。

我做错了什么?

在具有多个Where语句的循环中筛选IQueryable

LINQ的lambda表达式使用后期参数绑定,因此当表达式最终处理时,变量"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;
}

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