2011-02-11 3 views
0

데이터베이스의 행에 일련의 매개 변수가 저장되어 있는데 두 입력 매개 변수를 모두 충족하는 행을 반환하고 싶습니다. "& msg_type = 20560 & status = 101"& msgstype = 101 "Iqueryable 교차가 두 번 적용될 때 오류가 발생합니다

매개 변수가 하나 뿐인 경우에만 정상적으로 작동하는 코드가 있습니다. 두 개가 있으면 결과가 비워집니다. 그들은 디버거를 진행하면서,

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

나는 ... 라운드 두 번째 시간, sol_params가 키하지만 값으로 교차을 수행 끝 때문입니다 생각한다. 이것을 시도하십시오 :

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)을 참조하십시오.

또한 IQueryable<long> 대신 IEnumerable<long>sols를 선언하려고 할 것 - 그렇지 않으면 다시 클라이언트로 중간 데이터를 가져 오는 대신 내가 당신이 원하는 가정 무엇 데이터베이스에서 모두 실행됩니다.

관련 문제