2012-08-09 6 views
1

시도하고 검색 한 후 시간이 지나면 지금 내 문제를 공유 할 수 있다고 생각합니다.LINQ를 사용하여 동적 방법으로 필터 제품을 검색

문제 정의 : 나는 정수 (부동산 ID) 및 문자열 (McValue)을 포함 (filterPool이름) KeyValuePairs사전이있다. 내가 뭘 하려는지 그 제품에 따라 해당 KeyValuePairs 필터링 및 DataTable/List 같이 반환합니다. SQL로 "Where ... And .."절을 동적으로 빌드하는 것으로 간주 할 수 있습니다.

  foreach (KeyValuePair<int, string> filter in filterPool) 
      { 
       products = products.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value)); 
      } 
      return products.ToDataTable();     

문제는 foreach 루프 위입니다 사전에서 사용할 수있는 최신 KeyValuePair를 들어, 한 번만 작동하는 것 같다 : 여기

내가 사용하고있는 코드입니다.

지금까지 내가 유래에서 찾을 수 있기 때문에, 내 문제에 가장 가까운 솔루션이었다 this one, also using a Dictionary of values for filtering

사전 및 LINQ를 사용하여 필터링의 목표를 달성 할 수있는 방법이 있어야합니다; 또는 내가 누락되었거나 어떻게 든 보려고 무시하는 거대한 물건이있다.

이가 폐쇄 문제 감사 ^^

답변

2

, 주어진 문제는 모두를위한 충분한 분명하다 바랍니다. 당신은 임시함으로써이를 해결할 수 : 무슨 일이 일어나고 있는지에 대한 자세한 내용은

 foreach (KeyValuePair<int, string> filterTmp in filterPool) 
     { 
      var filter = filterTmp; // Make a temporary 
      products = products.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value)); 
     } 
     return products.ToDataTable(); 

에릭 Lippert의 게시물 Closing over the loop variable considered harmful를 참조하십시오.

또한이 동작은 C# 5에서 변경되었습니다. C# 5/VS2012에서는이 코드가 예상대로 작동합니다.

+0

덕분에 리드, 내가 인한 원격 SQL 서버와의 연결 문제로 지금 당신의 솔루션 제안을 시도 할 수 없습니다. 나는 그것을 빨리 시험 할 것이다! 빠른 답장을 보내 주셔서 다시 한 번 감사드립니다. – stckvflw

1

foreach를 반복 할 때마다 제품 컬렉션을 덮어 쓰게됩니다. 나는 당신의 컬렉션 데이터 유형이 무엇인지 모르겠지만, 당신은 대신 foreach는이 같은 작업을 수행 할 수 있습니다 :

products.AddRange(products.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value))); 

잘 모르겠어요 그 의미가 있다면,하지만 것 같아 filterPool과 일치하는 제품으로 구성된 컬렉션을 만들려고합니다.

+1

예, 완전히! :) – stckvflw

0

나는 그것이 더 나은 총으로 해결 될 것이라고 생각 :

return filter 
    .Aggregate(products, (acc, filter) => acc.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value))); 
    .ToDataTable();