首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linq与AutoMapper相结合

Linq与AutoMapper相结合
EN

Stack Overflow用户
提问于 2022-11-17 13:59:48
回答 2查看 70关注 0票数 0

我有一个循环,它使用AutoMapper将两个不同的对象实例( A & B )映射到第三个对象C的新实例中。对象C包含A & B合并的所有字段。

换句话说,它们可以是这样的:

代码语言:javascript
运行
复制
class A
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

class B
{
    public DateTime TimeOfBirth { get; set; }
}

// A & B combined
class C
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime TimeOfBirth { get; set; }
}

目前,我有一个循环,它使用AutoMapper首先将A映射到C。然后将B映射到结果中。如下所示:

代码语言:javascript
运行
复制
List<C> output = new();

foreach (var a in listA)
{
    C result = _mapper.Map<C>(a);

    _mapper.Map<B, C>(listB.Single(b => b.Id == a.ForeinKey), result);

    output.Add(result);
}

我想和Linq一起做这个。我最初的想法是使用拉链法,但我无法让它与AutoMapper一起工作。我希望它应该如下所示,但我无法让它工作(它不编译):

代码语言:javascript
运行
复制
var output = _mapper.Map<C>(listA).Zip(_mapper.Map<C>(listB));

我遗漏了什么?你能不能做我想做的事--而不是制造更大的麻烦?

EN

回答 2

Stack Overflow用户

发布于 2022-11-17 14:27:30

由于您希望第二次执行就地映射,所以仍然需要调用Map<B, C>(b, existingC)。为此,您可以使用过载选择器函数

代码语言:javascript
运行
复制
var output = _mapper.Map<C>(listA)
    .Zip(listB, (c, b) => _mapper.Map<B, C>(b, c));
票数 1
EN

Stack Overflow用户

发布于 2022-11-17 16:09:54

在这种情况下,您必须使用Join:

代码语言:javascript
运行
复制
var output = listA
    .Join(listB, a => a.ForeinKey, b => b.Id, (a, b) => 
       _mapper.Map<B, C>(_mapper.Map<C>(a))
    )
    .ToList();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74476748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档