如何使用管道将投影添加到聚合

问题描述 投票:0回答:1

我有以下模型及其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

c# .net mongodb mongodb-.net-driver
1个回答
0
投票

我不确定,但我认为你错过了投影

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();
© www.soinside.com 2019 - 2024. All rights reserved.