linq - AutoMapper ProjectTo 因 FirstOrDefault 失败

标签 linq automapper projection

我正在使用 AutoMapper ProjectTo 将 Person 实体映射到 EmployeeDto。在我的 EmployeeDto 中,我有一个想要捕获的 AddressDto 属性。因为这个人有一个地址集合,我定义了我的映射来捕获第一个:

.ForMember(d => d.Address, s => s.MapFrom(m => m.Addresses.FirstOrDefault())

问题是,当我将它包含在我的映射中时,我收到一个错误,指出“不支持指定类型成员“IsDeleted”...”IsDeleted 是具有 [NotMapped] 属性的 Person 的基本属性。我的 EmployeeDto 不包括 IsDeleted 属性。

当我查看 IQueryable 表达式属性时,我得到了这个:
System.Data.Entity.Core.Objects.ObjectQuery`1[MyProject.Data.Core.Entities.Person]
.MergeAs(MergeOption.AppendOnly)
.Where(
    // Quoted to induce a closure:
    a => a.FirstName.Contains(param.Value))
.Select(
    // Quoted to induce a closure:
    dto => new 0_Culture=neutral_PublicKeyToken=null>
    {
        IsDeleted = dto.IsDeleted,
        UpdateDate = dto.UpdateDate,
        CreateDate = dto.CreateDate,
        Id = dto.Id,
        …remaining Person entity properties removed for brevity,
        Addresses = dto.Addresses,
        Address = dto.Addresses.FirstOrDefault()
    })
.Select(

    // Quoted to induce a closure:
    dto => new EmployeeDto
    {
        …all employeedto property removed for brevity,
        Address = (dto.Address != null) ? new AddressDto { Id = dto.Address.Id } : null
    })

这是我的映射(ForSourceMember() 部分是我尝试过的,但它无法解决问题-无论是否有相同的结果):
configuration.CreateMap<Person, EmployeeDto>()
            .ForSourceMember(s => s.IsDeleted, x => x.Ignore())
            .ForSourceMember(s => s.CommonProperties, x => x.Ignore())
            .ForSourceMember(s => s.Events, x => x.Ignore())
            .ForMember(d => d.PersonId, s => s.MapFrom(m => m.Id))
            .ForMember(d => d.PersonType, s => s.UseValue(PersonTypes.Employee))                
            .ForMember(d => d.StatusType, s => s.MapFrom(m => m.PersonStatusType.Type))
            .ForMember(d => d.Status, s => s.MapFrom(m => m.PersonStatusType.Code))
            .ForMember(d => d.Address, s => s.MapFrom(m => m.Addresses.FirstOrDefault()))
            ;

我的 AddressDto 对 Address to AddressDto 有一个类似的 CreateMap 定义。

此外,当这些相同的对象是另一个 dto 对象的子对象时,映射会起作用。希望这足以让某人认识到我的问题。

编辑解决方法 - 添加条件将起作用。出于某种原因,它阻止 IQueryable 表达式创建 .Select(dto => new 0_Culture=neutral_publickkeytoken=null> 块:
.ForMember(d => d.Address, s => s.MapFrom(m => m.Addresses.Count > 0 ? m.Addresses.FirstOrDefault() : null)

最佳答案

这是一个 EF Core 问题,已在 EF Core 3.0 中修复。有关该问题的更多详细信息,请访问:https://github.com/dotnet/efcore/issues/15399 .
作为解决方法,您可以使用 .Take(1)并转换到 ICollection .

关于linq - AutoMapper ProjectTo 因 FirstOrDefault 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48288950/

相关文章:

computer-vision - QR 码 - 相机方向/投影

3d - 关于 3D 投影的问题?

c# - 从 Intersect 返回哪一项,是来自第一个可枚举项还是第二个可枚举项?

c# - 包含项目对的匹配项

c# - 使用 Linq To Objects 执行分组/投影的最简单方法

c# - AutoMapper - 为什么要覆盖整个对象?

automapper - 使用 AutoMapper 映射字典

c# - 重构 foreach 和 if's 到 Linq

c# - AutoMapper 通用转换

graphics - 将 y 剪切地平线偏移转换为光线转换器中的俯仰角