2009-06-03 4 views
1

나는 이것을 C# 개발자로서 8 일째 인생이라고 말하면서 머리말을 붙일 것이다.IQueryable.Where()에 대한 LINQ 동적 인수

내가 작업중인 프로젝트의 많은 DomainModels에 대해 사용자가 검토/검색 양식을 제출할 때 주어진 테이블의 모든 레코드를 필터링 할 수 있어야합니다.

는 현재 2 %의 짧은 투어는 다음과 같습니다

양식 FooController/검토에 제출합니다.

검토 한 후 사전에에 Params [ '필터']에서 모든 키/값 쌍을 잡고 통과하는 것과 매우 비슷 헬퍼 클래스 호출 FooFinder.ByProperties에 :

public IQueryable<WorkPlan> ByProperties(IDictionary<string, string> properties) 
    {    

     var result = ForSite(Convert.ToInt64(properties.DefaultVal("SiteId", "0"))); 

     v); 

     if(properties.ContainsKeyAndIsNotNullOrEmpty("WorkPlan.Key")) 
     { 
      var tempVal = Convert.ToInt64(properties["WorkPlan.Key"]); 
      result = result.Where(r => r.Id == tempVal); 
     } 
     // Multiple of these conditional checks follows 
     return result; 

}

나는 아직도 ... 최대한 repetative 코드를 줄이기 위해 좋아하고

result = ByProperty(properties, "WorkPlan.key", typeof (Int64), r, v => r.id == v); 

그러나 그게 전부는 분명히 많은 이유에 대해 작동하지 않을 뭔가를 시도 것 내가 성취하려고하는 것에 대한 생각이 거기에 있습니다. 정말 코드를 단순화하고 일종의 동적 헬퍼/유틸리티를 사용하여 필터링 프로세스를 가속화하고 싶습니다.

다른 아이디어는 리플렉션을 사용하여 직선 비교를하는 것이지만, 다음으로 모든 레코드가 "r => CreatedDatetime> CreatedFrom"보다 큰 CreatedDatime 속성을 확인하는 방법입니다.

아무도 이해가되지 않는 경우 의견을 보내 주시면 문제를 해결하도록 노력하겠습니다.

답변

2

수 있습니다.은 자동화되어 있지만 실제로 많은 작업이 필요하며 Expression API에 대한 지식이 필요합니다. 어느 것이 꽤 고급 주제입니다. "있는 그대로"아마 코드를 유지하는 것

은 ... 건조 당신이보고 싶을 수도 ... 알고 가치가 또 다른 격언 인 "코드가 작동 중단하지 않는다"또는

괜찮지 만, Dynamic LINQ Library - 이것은 자동 작업을 도와줍니다. 하지만 솔직히 말하면, 기존의 코드는 그렇게 추한 것은 아닙니다 ...

+0

그게 내 자신에 다이나믹 Linq 라이브러리를 발견했을 때 도달했습니다. 꽤 멋지지만 지금은 구현할 여유가 없습니다. – David