由于AnonymousObject而导致LINQ ArgumentException

时间:2018-12-04 22:24:19

标签: c# .net linq .net-core entity-framework-core

我正在尝试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对它们进行排序,最后才尝试进行{{1 }}原来的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进行排序,它属于空引用。

有人可以告诉我我做错了什么吗?-我仍然在学习基本的Linq,因此我完全迷上了这个问题。

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为问题出在OrderBy中。 您可以通过仅在projectsWithActivities上运行简单的OrderBy或其他linq操作来隔离问题吗?

projectsWithActivities.OrderBy(p = > ProjectActivities.Count)

然后一个接一个地添加其他操作。

答案 1 :(得分:0)

如果在Union或Concat中遇到此错误,则可能意味着子查询之一存在错误。将子查询从语句中拉出,然后在调试器中评估结果以查看错误是什么。