【问题标题】:LINQ ArgumentException due to AnonymousObjectLINQ ArgumentException 由于 AnonymousObject
【发布时间】: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&lt;Project&gt;

经过一些研究,我认为我的错误的原因是因为 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


【解决方案1】:

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

projectsWithActivities.OrderBy(p = > ProjectActivities.Count)

然后将其他操作一一添加。

【讨论】:

  • 嗯,通过仅按ProjectActivities.Count 排序,代码使其超过了当前崩溃的位置,但随后在一个不相关的空指针引用上崩溃了,我猜接下来我需要修复它!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    相关资源
    最近更新 更多