【发布时间】:2012-11-26 11:58:11
【问题描述】:
我研究动态 LINQ 已经有一段时间了,但我还没有了解它的秘密。
我有一个要解析的表达式,如下所示:
"document.LineItems.Select(i => i.Credit).Sum();"
在解析这个的过程中,我需要在 LineItems Collection 上调用 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”来轻松解决它。
但是,这并不是我想要的。我不希望所有 LineItems 都只用于计算 Sum(),这显然是 Enumerable 的情况。我希望 Queryable 工作。
另外,对于解析的最后一部分——Sum(),我还需要使用 Enumerable Sum(),因为 Queryable Sum() 会抛出相同的异常。
我检查了 MSDN,'Select' 函数的两个签名是相同的,所以我真的不明白为什么一个可以工作而另一个不行。
任何帮助或指点都将不胜感激。
问候,
【问题讨论】:
标签: c# linq iqueryable expression enumerable