应用两次时,Iqueryable Intersect失败

时间:2011-02-11 21:53:16

标签: c# asp.net

我有一系列参数存储在数据库中的行中,我想返回满足两个输入参数的行。参数在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]

我错过了一些愚蠢的东西吗?

1 个答案:

答案 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> - 否则它会将中间数据返回给客户端,而不是在数据库中执行所有数据,是我认为你想要的。