我有以下模型及其DTO
public class User
{
public string FullName { get; set; }
public string DomainEmail { get; set; }
}
public class UserDto
{
public string Name { get; set; }
public string Email { get; set; }
}
我必须通过聚合来执行此查询:
var matchStage = new BsonDocument(Match, new BsonDocument
{
{ nameof(User.FullName), new BsonDocument(Eq, "Foo bar") }
});
var pipeline = new[] { matchStage };
var result = await _collection.Aggregate<UserDto>(pipeline).ToListAsync();
return result;
我的问题是我不知道如何将属性从我的模型映射到我的 dto。这是一个基本示例,但在我的实际场景中,我的模型有超过 25 个字段,并且查询确实更大。我创建了一个投影,但我不知道如何将此投影应用到我的
.Aggregate
:
var projection = Builders<User>.Projection.Expression(m => new UserDto
{
Name = m.FullName,
Email = m.DomainEmail
});
var result = await _collection
.Aggregate<UserDto>(pipeline)
.Project(projection) // This doesn't work
.ToListAsync();
return result;
有办法解决这个问题吗?
.NET版本:8
MongoDB 驱动程序版本:2.24
我不确定,但我认为你错过了投影
var result = await _collection
.Aggregate<PipelineDefinition<User, UserDto>>(pipeline)
.ToListAsync().ConfigureAswait(false);
这假设您已经注册了用户:
IMongoCollection<User>
根据您的答案,您需要手动映射属性:
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<User, UserDto>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.FullName))
.ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.DomainEmail));
});
IMapper mapper = config.CreateMapper();