类型参数不能从使用中推断出来,有人可以帮忙吗?

Mar*_*tin 3 c# linq linq-to-objects compiler-errors dynamic-linq

我正在尝试使用Dynamic Linq(由ScottGu发布的那个)来执行GroupBy(lambda表达式).我有一个对象.我正在做AsQueryable.这就是我拥有的......

var result = Items.AsQueryable().GroupBy("DeliveryDate");
Run Code Online (Sandbox Code Playgroud)

但它给了我一个错误,说不能从使用中推断出论点.我认为它没有看正确的OrderBy.

物品是一个List<Stock>.

我尝试添加<> GroupBy但我认为我需要传递超过1项.我有点困惑.

我传入的字段(通过字符串)可以是任何类型,在此示例中它是DateTime.

如果我做我的标准LINQ它确实有效.即:

var result = Items.AsQueryable().GroupBy( x => x.DeliveryDate);
Run Code Online (Sandbox Code Playgroud)

这是扩展方法(来自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)));
}
Run Code Online (Sandbox Code Playgroud)

我在项目中使用using System.Linq.Dynamic;- 我OrderBy在另一种方法中使用动态,所以我知道它应该能够看到它.

我有点困惑,似乎使用动态LINQ它不明白我正在使用什么对象.

Aak*_*shM 5

具有此签名的扩展方法

public static IQueryable GroupBy(this IQueryable source, 
        string keySelector, string elementSelector, params object[] values)
Run Code Online (Sandbox Code Playgroud)

没有被这一行调用

var result =  Items.AsQueryable().GroupBy("DeliveryDate");
Run Code Online (Sandbox Code Playgroud)

因为只有一个this参数!所以编译器认为你是在常规之后GroupBy(需要a Func)并且感到困惑.

您需要提供其他selector字符串.

编辑添加

法线GroupBy很多重载,因此Dynamic Linq需要提供同样多的灵活性.GroupBy产生一系列分组,每个分组都有一个和一系列元素.如果像传统的LINQ调用一样,没有提到元素,那么源对象本身就被用作元素.

例如,使用一些假设类,分组Orders通过OrderDate产生IEnumerable<IGrouping<DateTime, Order>>.

但是,我们可以说,我们只关心OrderId输出,所以我们可以给GroupBy一个elementSelector使之产生的IEnumerable<IGrouping<DateTime, int>>.

要告诉Dynamic Linq使用Item自身作为元素,我们使用魔术字符串"it"作为elementSelector:

var result = Items.AsQueryable().GroupBy("DeliveryDate", "it");
Run Code Online (Sandbox Code Playgroud)

这应该与传统的LINQ调用具有相同的效果

var result = Items.AsQueryable().GroupBy(i => i.DeliveryDate);
Run Code Online (Sandbox Code Playgroud)