Linq Zip与AutoMapper结合使用

8ehkhllq  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(143)

我有一个循环,它使用AutoMapper将对象AB的两个不同示例Map到第三个对象C的新示例中。对象C包含AB的所有字段。
换句话说,它们可以像这样:

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首先将AMap到C,然后将BMap到结果,如下所示:

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来完成这个任务。我最初的想法是使用Zip method,但是我不能让它和AutoMapper一起工作。我希望它看起来像下面这样,但是我不能让它工作(它不能编译):

var output = _mapper.Map<C>(listA).Zip(_mapper.Map<C>(listB));

我错过了什么?有没有可能做我正在尝试的事情-而不制造更大的混乱?

1zmg4dgp

1zmg4dgp1#

因为你想第二次做一个就地Map,你仍然需要调用Map<B, C>(b, existingC)。为此你可以使用Zip重载,带一个选择器函数:

var output = _mapper.Map<C>(listA)
    .Zip(listB, (c, b) => _mapper.Map<B, C>(b, c));
piok6c0g

piok6c0g2#

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

var output = listA
    .Join(listB, a => a.ForeinKey, b => b.Id, (a, b) => 
       _mapper.Map<B, C>(_mapper.Map<C>(a))
    )
    .ToList();

相关问题