2011-09-21 4 views
3

나는 GroupBy (람다 식)를하기 위해 Dynamic Linq (ScottGu가 발행 한 것)를 사용하려고합니다. 나는 물건이있다. 그리고 나는 AsQueryable하고있다. 이것은 내가 가지고있는 것입니다 ..형식 인수를 사용에서 유추 할 수 없습니다. 아무도 도와 줄 수 있습니까?

하지만 논점을 사용에서 유추 할 수 없다는 오류가 발생합니다. 나는 그것이 올바른 주문을 보지 못한다고 생각한다.

항목은 List<Stock>입니다.

나는 <>을 GroupBy에 추가하려고 시도했지만 1 개 이상의 항목을 전달해야한다고 생각합니다. 나는 조금 혼란 스럽다.

내가 전달하는 필드 (문자열을 통해)는 모든 유형이 될 수 있습니다.이 예에서는 DateTime입니다.

표준 LINQ를 수행하면 작동합니다. 예 : 다음

var result = Items.AsQueryable().GroupBy(x => x.DeliveryDate); 

은 (ScottGu에서) 확장 방법 :

public static IQueryable GroupBy(this IQueryable source, string keySelector, string elementSelector, params object[] values) { 
    if (source == null) throw new ArgumentNullException("source"); 
    if (keySelector == null) throw new ArgumentNullException("keySelector"); 
    if (elementSelector == null) throw new ArgumentNullException("elementSelector"); 
    LambdaExpression keyLambda = DynamicExpression.ParseLambda(source.ElementType, null, keySelector, values); 
    LambdaExpression elementLambda = DynamicExpression.ParseLambda(source.ElementType, null, elementSelector, values); 
    return source.Provider.CreateQuery(
     Expression.Call(
      typeof(Queryable), "GroupBy", 
      new Type[] { source.ElementType, keyLambda.Body.Type, elementLambda.Body.Type }, 
      source.Expression, Expression.Quote(keyLambda), Expression.Quote(elementLambda))); 
} 

나는이 프로젝트 using System.Linq.Dynamic;에 사용했다가 - 그리고 난 다른 방법으로 동적 OrderBy을 사용하고, 그래서 내가 그것을해야 알 그것을 볼 수 있습니다.

약간 혼란 스럽지만 동적 LINQ를 사용하여 어떤 개체를 사용하고 있는지 이해하지 못하는 것 같습니다. 단지 this 인수 거기로이 서명

public static IQueryable GroupBy(this IQueryable source, 
     string keySelector, string elementSelector, params object[] values) 

+0

[my article on CP] (http://www.codeproject.com/KB/webforms/HandleGridViewOnSorting.aspx)를 참조하십시오. 동일한 문제에 대한 다른 해결책이 있습니다. – abatishchev

답변

5

확장 방법은이 라인

var result = Items.AsQueryable().GroupBy("DeliveryDate"); 

에 의해 호출되지 않는! 그래서 컴파일러는 당신이 보통 GroupBy (그게 Func 걸립니다) 뒤에 있고 혼란 스럽다고 생각합니다.

다른 selector 문자열을 제공해야합니다.

편집

정상 GroupBylots of overloads을 가지고 추가하는 등 동적 Linq에는 많은 유연성을 제공 할 필요가있다. GroupBy은 각각 요소의 시퀀스를 갖는 그룹화 시퀀스를 생성합니다. 기존 LINQ 호출 에서처럼 요소에 대한 언급이 없으면 소스 개체 자체가 요소로 사용됩니다.

예를 들어, 일부 가상 클래스를 사용하여 OrdersOrderDate으로 그룹화하면 IEnumerable<IGrouping<DateTime, Order>>가 생성됩니다.

그러나 우리는 우리가 단지 출력의 OrderId에 관심 말할 수 있습니다, 그래서 우리는 그것이 IEnumerable<IGrouping<DateTime, int>>을 생산하기 위해 GroupByelementSelector을 줄 수 있습니다.

var result = Items.AsQueryable().GroupBy("DeliveryDate", "it"); 

이 다음 기존 LINQ 호출

var result = Items.AsQueryable().GroupBy(i => i.DeliveryDate); 
하는 것과 같은 효과가 있어야합니다

우리가 elementSelector으로 마법 문자열 "it"를 사용하여 동적 Linq에이 요소로 Item 자체를 사용하여 말할
+0

고마워요! 예, 작동하는 것으로 보입니다! 큰 감사합니다. 그래서 내가 실제로 2 개의 문자열을 전달해야합니까? 실제로 keyselector 및 요소 선택기 란 무엇입니까? 키 선택 = DeliveryDate ?? 요소 선택기 란 무엇입니까? – Martin

+0

@Martin 업데이트보기 – AakashM

+0

@AakashM :하지만 왜'it'입니까? – abatishchev

관련 문제