在具有多个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)。所以我得出结论,倍数。问题出在哪里。
但现在我看到温度是空的,甚至在我做第二个地方之前。
我做错了什么?
尝试更改代码以将密钥存储在本地变量中,然后使用它:
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;
}
我认为你应该改变的另一件事是将年龄场选角为字符串,而不是相反的方向。因此,数据库比较的是数字而不是字符串。