我有一系列参数存储在数据库中的行中,我想返回满足两个输入参数的行。参数在URL中显示,例如“& msg_type = 20560& status = 101”
我的代码工作正常,但只有有一个参数。如果有两个,它会清空结果。这是我的代码:
IQueryable<long> sol_params = (from param in db.kb_solution_param_list
select param.solution_id).Distinct();
foreach (String key in Request.QueryString.Keys)
{
String val = Request.QueryString[key];
IEnumerable<long> sols = from param in db.kb_solution_param_list
where param.parameter_name == key && param.value == val
select param.solution_id;
sol_params = sol_params.Intersect(sols);
}
这是变量的状态,因为它们通过调试器:
Initial:
sol_params:
[250 , 251 , 252 , 253 , 254 , 255 , 256 , 257 , 258 , 259 , 260 , 261 , 262 , 263 , 264 , 265 , 307 , 332 , 336]
Foreach Loop:
key: msg_type val: 20560
sols:
[250 , 251]
sol_params:
[250 , 251]
key: status val: 101
sols:
[250 , 252 , 253 , 254 , 255 , 256 , 257 , 258 , 259 , 260 , 261 , 262 , 263 , 265 , 266 , 267 , 268 , 269 , 270 , 271 , 272]
sol_params:
[]
我期待的输出是sol_params:[250]
我错过了一些愚蠢的东西吗?
答案 0 :(得分:1)
我怀疑这是因为第二次,sol_params最终执行与第二键相交但第一值...因为你的方式'重新捕获隐式lambda表达式中的变量。试试这个:
foreach (String key in Request.QueryString.Keys)
{
String keyCopy = key;
String val = Request.QueryString[key];
IEnumerable<long> sols = from param in db.kb_solution_param_list
where param.parameter_name == keyCopy && param.value == val
select param.solution_id;
sol_params = sol_params.Intersect(sols);
}
请注意where
子句的更改。
有关更多信息,请参阅Eric Lippert关于捕获循环变量的博客文章(part 1; part 2)。
我还会尝试将sols
声明为IQueryable<long>
而不是IEnumerable<long>
- 否则它会将中间数据返回给客户端,而不是在数据库中执行所有数据,是我认为你想要的。