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

本文关键字:不能 用法 推断出 类型参数 | 更新日期: 2023-09-27 18:09:27

我试图使用动态Linq (ScottGu发布的一个)做一个GroupBy (lambda表达式)。我有一个对象。我在做AsQueryable。这就是我的…

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

但是它给了我一个错误,说参数不能从用法中推断出来。我认为这不是正确的顺序。

Items为List<Stock>

我试着添加<>到GroupBy,但我认为我需要传递不止一个项目。我有点糊涂了。

我传入的字段(通过字符串)可以是任何类型,在这个例子中它是一个日期时间。

如果我使用我的标准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它不理解我在使用什么对象

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

具有此签名的扩展方法

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

没有被这行

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

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

您需要提供另一个selector字符串。

edit添加

普通的GroupBy有很多过载,所以动态Linq需要提供同样多的灵活性。GroupBy生成一个组序列,每个组都有一个和一个元素序列。如果像在传统的LINQ调用中一样,没有提到元素,则源对象本身被用作元素。

例如,使用一些假设的类,将OrdersOrderDate分组产生IEnumerable<IGrouping<DateTime, Order>>

但是我们可以说我们只关心输出中的OrderId,所以我们可以给GroupByelementSelector以使其产生IEnumerable<IGrouping<DateTime, int>>

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

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

这应该具有与传统LINQ调用

相同的效果
var result = Items.AsQueryable().GroupBy(i => i.DeliveryDate);