2011-03-03 2 views
4

LINQ DynamicLibrary로 약간의 실험을 시작했습니다. 여러 LINQ 문을 몇 개 또는 하나의 동적 LINQ 쿼리로 대체하려고합니다. 보시다시피LINQ DynamicLibrary : IQueryable에서 개수 및 목록을 추출하는 방법

private List<TicketChartData> GenerateImpl(IList<ServiceItem> myList) 
{ 
    var output = from ticket in myList 
      group ticket by ticket.Region into grouped 
      orderby grouped.Count() descending 
      select new TicketChartData(grouped.Key, grouped.Count(), grouped.ToList()); 
    return output.ToList(); 
} 

이 작품의 내 단위 ServiceItem입니다 다음과 같이 기존의 정적 쿼리입니다. 이 작업은 모두 정상적으로 작동하며 결과 집합은 Region으로 그룹화됩니다. DynamicLibrary를 사용하면 유효한 동적 필드로 그룹화 할 수 있습니다 (별도로 검증을 처리합니다). 그래서 DynamicLibrary를 사용하여 같은 쿼리를 작성했지만 매우 성공적이지는 않습니다. 여기에 물론 컴파일되지 않는 새로운 방법이다 : 나는 추출 할 수 없었다

private List<TicketChartData> GenerateImpl(IList<ServiceItem> myList, string field) 
{ 
    IQueryable<ServiceItem> queryableList = myList.AsQueryable<ServiceItem>(); 
    IQueryable groupedList = queryableList.GroupBy(field,"it"). 
          OrderBy("Key descending"). 
          Select("new (Key as Key)"); // Not what i need 
    return output.ToList(); 
} 

어느 것도 Count이나 그룹에서 List. 어떻게해야합니까? 나는 해결책을 찾기 위해 상당한 시간을 보냈다. 가능한 경우 Reflection 사용을 피할 수 있기를 원합니다. 이 링크에는 다음과 같은 몇 가지 지침이 있지만 실제 문제에는 도움이되지 않습니다. 모든 도움을 미리 감사드립니다.

System.LINQ.Dynamic: Select(" new (...)") into a List<T> (or any other enumerable collection of <T>)

답변

2

카운트를 들어이 다음과 같이 쓸 수있다 :

private List GenerateImpl(IList myList, string field) 
{ 
    IQueryable queryableList = myList.AsQueryable(); 
    IQueryable groupedList = queryableList.GroupBy(field,"it"). 
          OrderBy("Key descending"). 
          Select("new (Key as Key, Count() as Count)"); 

    // Note: IQueryable doesn't have ToList() implementation - only IEnumerable 
    return output.ToList(); // will not work 
} 

목록를 들어 - 당신이 DynamicLibrary에 사용자 정의 구현을 추가해야합니다 수 ... 방법을 참조하십시오 그것은 Contains() 메서드에 대해 수행되었습니다. here

+0

유용한 정보 그러나 문제를 해결하지는 못합니다. 신중하게 내 쿼리를 사용하는 경우 ** GroupBy **를 사용합니다. 이것은 구별되는 요소입니다. GroupBy는 열거 할 수없는 _dynamic_ 유형의 객체를 만듭니다. GroupBy는 IQueryable을 반환하는 반면 select, where, orderby 등은 IQueryable을 반환합니다. 여기서 T는 소스 유형입니다. –

0

해결책은를 사용하는 것입니다.내 제품에서 제공하는 LINQ 확장 메서드 AdaptiveLINQ.

면책 조항 : 저는 AdaptiveLINQ 개발자입니다