我正在尝试使用Dynamic Linq(由ScottGu发布的那个)来执行GroupBy(lambda表达式)。我有一个对象。我正在做AsQueryable。这就是我的......
var result = Items.AsQueryable().GroupBy("DeliveryDate");
但它给了我一个错误,说不能从使用中推断出参数。我认为它没有看正确的OrderBy。
项目是List<Stock>
。
我尝试添加&lt; &GT;到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它不明白我正在使用什么对象。
答案 0 :(得分:5)
带有此签名的扩展方法
public static IQueryable GroupBy(this IQueryable source,
string keySelector, string elementSelector, params object[] values)
未被此行调用
var result = Items.AsQueryable().GroupBy("DeliveryDate");
因为只有一个非this
参数!所以编译器认为你是在常规GroupBy
之后(需要Func
)并且感到困惑。
您需要提供其他selector
字符串。
编辑添加
正常GroupBy
有lots of overloads,因此Dynamic Linq需要提供同样多的灵活性。 GroupBy
生成一系列分组,每个分组都有键和一系列元素。如果像传统的LINQ调用一样,没有提到元素,那么源对象本身就被用作元素。
例如,使用某些假设类,按Orders
对OrderDate
进行分组会产生IEnumerable<IGrouping<DateTime, Order>>
。
但我们可以说我们只关心输出中的OrderId
,因此我们可以GroupBy
elementSelector
IEnumerable<IGrouping<DateTime, int>>
来生成Item
。
要告诉Dynamic Linq使用"it"
本身作为元素,我们使用魔术字符串elementSelector
作为var result = Items.AsQueryable().GroupBy("DeliveryDate", "it");
:
var result = Items.AsQueryable().GroupBy(i => i.DeliveryDate);
这应该与传统的LINQ调用具有相同的效果
{{1}}