【发布时间】:2018-12-04 22:24:18
【问题描述】:
我正在尝试Union 两个相同类型的IQueryables,但遇到以下错误
An exception of type 'System.ArgumentException' occurred in System.Private.CoreLib.dll but was not handled in user code: 'The input sequence must have items of type 'MyProject.Data.Entities.Project', but it has items of type 'Microsoft.EntityFrameworkCore.Query.Internal.AnonymousObject'.'
基本上,我将列出Projects 并将具有Any() ProjectActivities 的列表分离到他们自己的列表中 - 然后我按Activity Name 对它们进行排序,然后最终尝试将Union 原始Projects 返回在。
我的代码原来是:
IQueryable<Project> projectsWithActivities = projects
.Where(x => x.ProjectActivities.Any())
projects = projectsWithActivities
.OrderBy(u => u.ProjectActivities
.OrderBy(p => p.Activity.Name)
.FirstOrDefault().Activity.Name)
.AsQueryable()
.Union(projects);
请注意,projects 是作为方法参数传入的现有 IQueryable<Project>。
经过一些研究,我认为我的错误的原因是因为 Where 导致 projectsWithActivities 变成 AnonymousObject 并且为了克服这个问题,我不得不将 Select 变成一个新的 Project 对象所以我将代码更改为:
IQueryable<Project> projectsWithActivities = projects
.Where(x => x.ProjectActivities.Any())
.Select(x => new Project(){Id = x.Id, SomeProperty = x.SomeProperty,
etc etc});
但是,这没有任何区别,我仍然面临上述错误。
另外,如果您想知道为什么我将 Projects 列表分离出来,然后尝试将它们合并回来,这是因为一些 Projects 没有任何 ProjectActivities,因此每当我尝试按Activity Name 它落在空引用上。
有人可以解释一下我做错了什么吗?我还在学习基本的 Linq,所以我完全被这个难住了。
提前致谢!
【问题讨论】:
-
你能告诉我们为什么你觉得有必要明确添加
.AsQueryable()吗?如果你删除它,它会起作用吗? -
我注意到
OrderBy返回一个IEnumerable所以我认为问题是因为我试图Union一个IEnumerable和一个IQueryable但不幸的是它不起作用有或没有它。 -
如果删除
AsQueryable,确切的错误是什么? -
你确定错误来自你显示的行,你传递给函数的是什么?必要时将评估该参数,因此异常可能来自该参数。我对虚拟数据运行了上述 linq 查询,没有发现异常。
-
@mjwills 每当我删除
AsQueryable时都会收到错误消息:An exception of type 'System.ArgumentException' occurred in System.Private.CoreLib.dll but was not handled in user code: 'The input sequence must have items of type 'MyProject.Entities.Project', but it has items of type 'Microsoft.EntityFrameworkCore.Query.Internal.AnonymousObject'.'
标签: c# .net linq .net-core entity-framework-core