i.Credit).-6ren">
gpt4 book ai didi

c# - 动态 LINQ,Select 函数,适用于 Enumerable,但不适用于 Queryable

转载 作者:行者123 更新时间:2023-11-30 15:36:22 25 4
gpt4 key购买 nike

我一直在摆弄动态 LINQ 有一段时间了,但我还没有了解它的 secret 。

我有一个要解析的表达式,如下所示:

"document.LineItems.Select(i => i.Credit).Sum();"

在解析过程中,我需要调用 LineItems 集合上的 Select 函数。我正在使用 Expression.Call 的工厂方法:

Expression.Call(
typeof(Queryable),
"Select",
new Type[] { typeof(LineItem), typeof(decimal?) },
expr,
Expression.Lambda(expression, new ParameterExpression[] { Expression.Parameter(typeof(LineItem) }));

此刻

expr:          document.LineItems    [ICollection<LineItem>]  
expression: LineItem.Credit [decimal?]

这些都还没有实现。我现在正在构建表达式树。

现在,问题:

此 Expresssion.Call 抛出异常:“类型‘System.Linq.Queryable’上的泛型方法‘Select’与提供的类型参数和参数不兼容”;

我通过更改 Expression.Call 的第一个参数在“System.Linq.Enumerable”中查找“Select”而不是“Queryable”来轻松解决此问题。

但是,这并不是我想要的。我不希望拖入的所有 LineItem 仅用于计算 Sum(),这显然是 Enumerable 的情况。我想让 Queryable 工作。

此外,对于解析的最后一部分 - Sum(),我还需要使用 Enumerable Sum(),因为 Queryable Sum() 会抛出相同的异常。

我查看了 MSDN,“选择”函数的两个签名是相同的,所以我真的不明白为什么一个可以工作而另一个不能。

如有任何帮助或指点,我们将不胜感激。

问候,

最佳答案

问题是 LineItems是一个 ICollection<LineItem> , 而第一个参数为 Queryable.Select需要 IQueryable<LineItem> . ICollection<T>只实现 IEnumerable<T>这就是为什么它适用于 Enumerable.Select .

您需要更改 expr 的类型成为IQueryable<LineItem> .

您应该能够使用 Queryable.AsQueryable 执行此操作方法。以下函数创建一个表达式来对给定 Document 的信用属性值求和实例:

public static Expression<Func<decimal?>> CreateSumLineItemsExpr(Document document)
{
var docExpr = Expression.Constant(document);
var itemsExpr = Expression.Property(docExpr, "LineItems");

Expression<Func<LineItem, decimal?>> selector = i => i.Credit;
var queryableExpr = Expression.Call(typeof(Queryable), "AsQueryable", new[] { typeof(LineItem) }, itemsExpr);
var selectExpr = Expression.Call(typeof(Queryable), "Select", new[] { typeof(LineItem), typeof(decimal?) }, queryableExpr, selector);
var sumExpr = Expression.Call(typeof(Queryable), "Sum", null, selectExpr);

return Expression.Lambda<Func<decimal?>>(sumExpr);
}

关于c# - 动态 LINQ,Select 函数,适用于 Enumerable,但不适用于 Queryable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13777781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com