gpt4 book ai didi

linq - AutoMapper ProjectTo 因 FirstOrDefault 失败

转载 作者:行者123 更新时间:2023-12-03 17:15:57 29 4
gpt4 key购买 nike

我正在使用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com