- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
i.Credit).-6ren">
我一直在摆弄动态 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/
重现问题的代码 我遇到了一个 IQueryable.Where 的情况电话返回 IQueryable其中 TOther != TSource .我整理了一些示例代码来重现它: using System
例如,我有一个 Product 实体、一个 ProductViewModel 和一个 Label 实体。我的两个产品属性对应于标签代码而不是实际值。例如,产品的名称是“code1234”,它对应于具有
我正在使用 Diesel crate执行一些数据库工作。在某些表中,应将表的两列一起视为一个键。 这种模式在数据库中的许多地方都重复出现,因此最好避免使用大量重复的复制粘贴代码来处理这种情况。但是,我
我正在使用 EF6 为应用程序实现搜索/筛选器 UI 的后端。我有代码构建一个与 Queryable.Where 一起使用的表达式,对于给定的 DbSet,DbSet 的类型在运行时确定(DBCo
我有一个数据库查询: var configs = dbData.Configs.Where(e => headers.Contains(e.headerId) && e.flag == "true")
如何声明这样的变量? var rData = from nc in ctx.NEWSLETTER_CLIENTS join ni
1.在数据库中以json字符串格式保存,如:[{"name":"张三","time":"8.592","ar
重要 问题不是“Queryable.OfType 有什么作用,而是“我在那里看到的代码是如何实现的?” 反射(reflection) Queryable.OfType,我看到(经过一些清理):
你怎么了黑帮? 我有以下代码似乎总是返回 null。 public static T GetNext(this IQueryable list, T current) {
我有以下代码 var results = repository.GetItemsAsQuery().Where( user =>
我正在编写一个转换 IQueryable 查询的访问者。它使用带有种子 null 的 Aggregate 方法,然后使用一些 func 对其进行转换。我的问题是这个 null 是 decimal? 类
我有这个存储库方法: public IQueryable GetAll() { using (var context = new DatabaseContext()) {
我不太了解界面,所以我想我会以一种有助于我更好地理解它的方式来表述这个问题。 我正在学习如何制作 IQueryable 的教程。为什么我不能只做一个 Queryable? 最佳答案 Queryable
我对 Linq 有点陌生,希望有人能帮助我解决我目前正在苦苦挣扎的事情。 我目前有 2 个列表 public IQueryable Roles { get { var role
我有一个 ASP.NET 站点,它已经完美运行了很长时间,最近没有任何变化。从一个小时到下一个小时,我开始在我执行 LINQ 查询的一行中收到 IndexOutOfRangeException: va
我想知道如何在列表中存储 orderby 表达式。这就是我想写的: List>> list = new List>>() { p => p.Name, p => p.Id }; 然后: var
我正在构建一个基于 LINQ 的查询生成器。 其中一项功能是能够将任意服务器端投影指定为查询定义的一部分。例如: class CustomerSearch : SearchDefinition {
我正在尝试在我的 API 中实现 Guardian 并通过它执行登录以获取 JWT。我正在看的教程是here .问题是使用类似于他们在示例中使用的用户模型来实现登录。模型代码如下所示: defmodu
我有一个简单的 GET 方法,它返回 IQueryable,并且对查询有一些先决条件: [Queryable(HandleNullPropagation = HandleNullPropagation
我有一个简单的 WebApi 方法,就像这样用 OData 可查询属性装饰。 [Queryable] public virtual IQueryable Get() {
我是一名优秀的程序员,十分优秀!