私は、Dynamic Linq(ScottGuによって公開されたもの)を使用してGroupBy(ラムダ式)を実行しようとしています。オブジェクトがあります。そして、私はAsQueryableをやっています。これは私が持っているものです。
var result = Items.AsQueryable().GroupBy("DeliveryDate");
しかし、引数は使用法から推測できないというエラーが表示されます。正しいOrderByを見ていないと思います。
アイテムはList<Stock>
です。
<をGroupBy
追加してみましたが、複数の項目を渡す必要があると思います。少し混乱しています。
(文字列を介して)渡したフィールドは任意のタイプにすることができます。この例では、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;
するプロジェクトでusing System.Linq.Dynamic;
-そして、別のメソッドで動的なOrderBy
を使用しているので、それを表示できるはずです。
私は少し混乱しています。動的なLINQを使用しているようで、使用しているオブジェクトを理解できません。
この署名を持つ拡張メソッド
public static IQueryable GroupBy(this IQueryable source,
string keySelector, string elementSelector, params object[] values)
この行によって呼び出されていません
var result = Items.AsQueryable().GroupBy("DeliveryDate");
this
非引数は1つしかないthis
!そのため、コンパイラーはあなたが通常のGroupBy
(これはFunc
)の後であると判断し、混乱します。
他のselector
文字列を指定する必要があります。
編集して追加
通常のGroupBy
は多くのオーバーロードがあるため、Dynamic Linqは同じくらい柔軟性を提供する必要があります。 GroupBy
は、それぞれがキーと一連の要素を持つ一連のグループ化を生成します。従来のLINQ呼び出しのように、要素について言及されていない場合、ソースオブジェクト自体が要素として使用されます。
たとえば、いくつかの架空のクラスを使用して、 IEnumerable<IGrouping<DateTime, Order>>
Orders
をグループ化すると、 IEnumerable<IGrouping<DateTime, Order>>
生成されOrderDate
。
ただし、出力ではOrderId
のみをOrderId
しているとOrderId
ため、 GroupBy
にelementSelector
を指定して、 IEnumerable<IGrouping<DateTime, int>>
生成することができます。
動的LinqにItem
自体を要素として使用するように指示するには、 elementSelector
として魔法の文字列"it"
を使用します。
var result = Items.AsQueryable().GroupBy("DeliveryDate", "it");
これは、従来のLINQ呼び出しと同じ効果を持つはずです。
var result = Items.AsQueryable().GroupBy(i => i.DeliveryDate);