2011-09-21 4 views
3

私はGroupBy(ラムダ式)を行うためにDynamic Linq(ScottGuが発行したもの)を使用しようとしています。私には物体があります。私はAsQueryableをやっています。これは私が持っているものです..型引数を使用から推測することはできません、誰も助けてくださいできますか?

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

しかし、それは私に引数が使用から推論することはできないと言っているエラーを与えます。私はそれが正しいOrderByを見ていないと思う。

商品は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を与えることができます。要素としてItem自体を使用するために、動的LINQのを伝えるために

、我々はelementSelectorと魔法の文字列"it"を使用します。

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

そして、これは、従来のLINQコール

var result = Items.AsQueryable().GroupBy(i => i.DeliveryDate); 
と同じ効果を持つべきです
+0

ありがとう!はい、それは動作しているようです!大変ありがとうございます。だから私は実際に2つの文字列を渡す必要がありますか?キーセレクタと要素セレクタは実際には何ですか? Key select = DeliveryDate ??要素セレクタとは何ですか? – Martin

+0

@Martin更新を参照 – AakashM

+0

@AakashM:なぜそれは '? – abatishchev

関連する問題