如何正确使用 EF Core 和 AutoMapper ProjectTo 和 Unions?

Pho*_*bis 12 union projection automapper asp.net-core-2.0 ef-core-2.0

我的设置

  • ASP.NET 核心 2.0
  • 实体框架核心 2.0.1
  • 自动映射器 6.2.2

问题

我有一个名为 DTO 的项目PersonDetail和一个名为Person. 当我打电话

db.People.Where(p => p.FirstName == "Joe").Union(db.People.Where(p => Age > 30)).ProjectTo<PersonDetail>(mapperConfig).ToList(); 
Run Code Online (Sandbox Code Playgroud)

我没有得到PersonDetailDTO 和实体框架(核心)抛出异常的消息:

ArgumentException:输入序列必须具有“Test.Module.Entities.Person”类型的项目,但它具有“Test.Module.Dtos.PersonDetail”类型的项目。


没有问题的例子

当我运行代码时:

 db.People.Where(p => p.FirstName == "Joe").Union(db.People.Where(p => Age > 30)).ToList(); 
Run Code Online (Sandbox Code Playgroud)

Person毫无例外地得到了实体。


执行计划

这是一个工作计划(有工会):

{value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Test.Module.Entities.Person]).Where(entity => ((entity != null) And ((63ed0ebd-2c02-4496-ac8d-b836cbf13259 = = entity.CreatedBy) 或 (393a6bb0-b437-4664-beb0-6800f509451b == entity.CreatedBy)))).Union(value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Test.Module.Entities.Person] ))}

现在这是相同的计划,但也有自动映射器投影:

{value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Test.Module.Entities.Person]).Where(entity => ((entity != null) And ((63ed0ebd-2c02-4496-ac8d-b836cbf13259 = = entity.CreatedBy) 或 (393a6bb0-b437-4664-beb0-6800f509451b == entity.CreatedBy)))).Union(value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Test.Module.Entities.Person] )).Select(dto => new PersonDetail() {FirstName = dto.FirstName, LastName = dto.LastName, Deleted = dto.Deleted, Age = dto.Age, CreatedUtc = dto.CreatedUtc, CreatedBy = dto.CreatedBy, Id = dto.Id, RecordVersion = dto.RecordVersion, DisplayLabel = ((dto.FirstName + " ") + dto.LastName)})}


笔记:

我只是调用 ToList 来减少这个问题到它的最小形式。我知道在这个例子中我似乎不需要使用 ProjectTo 。在我的实际代码中,我们使用的是 OData,我们需要最终结果是投影查询,其中 DTO 作为 Queryable 对象。我也明白这个联盟不是一个很好的联盟例子,再次,只是为了简化联盟问题。

Ia 还在各自的 GitHub 项目上打开了问题:

EntityFrameworkCore : https://github.com/aspnet/EntityFrameworkCore/issues/11033

AutoMapperhttps : //github.com/AutoMapper/AutoMapper/issues/2537

Pho*_*bis 5

这是一个 EF Core 错误,已在 EF Core 2.1 中修复 https://github.com/aspnet/EntityFrameworkCore/issues/11033