.net core 如何使用ProjectTo在Automapper中有条件地映射From

.net core 如何使用ProjectTo在Automapper中有条件地映射From,.net-core,entity-framework-core,automapper,.net Core,Entity Framework Core,Automapper,我想使用Automapper 10.1.1中的投影为EFCore 5创建一个查询,该投影将有条件地包含关联。 如果我在select语句中编写此语句,我将执行以下操作: \u dbContext.Employees .Select(x=>newemployeedto() { Id=x.Id, 合同=包括合同?新合同到() { Id=x.Contract.Id }:null }) .FirstAsync(); 我是这样尝试的: 模型 //源代码 公营雇员 { 公共int Id{get;set;}

我想使用Automapper 10.1.1中的投影为EFCore 5创建一个查询,该投影将有条件地包含关联。 如果我在select语句中编写此语句,我将执行以下操作:

\u dbContext.Employees
.Select(x=>newemployeedto()
{
Id=x.Id,
合同=包括合同?新合同到()
{
Id=x.Contract.Id
}:null
})
.FirstAsync();
我是这样尝试的:

模型

//源代码
公营雇员
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共整数{get;set;}
公共契约ActiveContract{get;set;}
}
公共类合同
{
公共int Id{get;set;}
公共DateTimeOffset开始日期{get;set;}
public DateTimeOffset EndDate{get;set;}
公共雇员雇员{get;set;}
public int EmployeeId{get;set;}
}
//目的地
公共类雇员
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共整数{get;set;}
public contracted到ActiveContract{get;set;}
}
公共类合同
{
公共int Id{get;set;}
公共DateTimeOffset开始日期{get;set;}
public DateTimeOffset EndDate{get;set;}
}
自动制版机配置文件

公共类EmployeeProfile:Profile
{
公共雇员档案
{
bool includeContract=false;
CreateMap()
.ForMember(x=>x.ActiveContract,opt=>opt.MapFrom(x=>includeContract?x.ActiveContract:null));
}
}
我没有使用
null
,而是尝试了
default(Contract)
(Contract)null
,它们产生了相同的结果。 我还有一个合同映射,只是一个简单的

质疑

bool includeContract=someCondition;
var result=await_dbContext.Employees
.ProjectTo(_mapper.ConfigurationProvider,新{includeTrack})
.FirstAsync(x=>x.id==id);
我的预期结果是,我将返回一个合同为空的
EmployeeDto
,除非
includeContract
设置为true

但是,如果
includeContract
为false,则会引发以下错误:

System.invalidoOperationException:SQL树中的表达式“NULL”未分配类型映射

生成的查询表达式:

编译查询表达式:
'DbSet()
.Select(dtoEmployee=>new EmployeeDto{
年龄=D员工。年龄,
Id=dtoEmployee.Id,
Name=dtoEmployee.Name,
ActiveContract=null==null?null:新合同到{
Id=null.Id,
StartDate=null.StartDate,
EndDate=null.EndDate
}
}
)
.First(x=>x.Id==\u Id\u 0)'

我知道通过使用在
转换器中显式定义表达式可以实现这一点,但如果可能,我希望避免写出我的全部DTO。

参考注释中通过@Lucian链接的文档

解决方案是将AutoMapper配置调整为以下内容:

CreateMap()
.ForMember(x=>x.ActiveContract,opt=>opt.ExplicitExpansion())
并将查询调整为以下内容:

var result=await\u dbContext.Employees
.ProjectTo(_mapper.ConfigurationProvider,
无效的
dest=>dest.ActiveContract
)
.FirstAsync(x=>x.id==id);

@LucianBargaoanu这似乎实现了我的目标!(从文档中)我唯一不清楚的部分是,我需要在每个成员上设置
ExplicitExpansion