C# 将聚合的部分映射到列表<;T>;
假设我们有一个简单的业务对象:C# 将聚合的部分映射到列表<;T>;,c#,linq,automapper,C#,Linq,Automapper,假设我们有一个简单的业务对象: class SimpleBO { public string Field1{get;set;} public string Field2{get;set;} } 此外,我们还有一个类似这样的复杂骨料: class ComplexBO { public SimpleBO SimpleBOField {get;set} public List<SomeClass> ObjectList {get;set;} publi
class SimpleBO
{
public string Field1{get;set;}
public string Field2{get;set;}
}
此外,我们还有一个类似这样的复杂骨料:
class ComplexBO
{
public SimpleBO SimpleBOField {get;set}
public List<SomeClass> ObjectList {get;set;}
public SomeClass Object {get;set;}
}
现在,在我的程序的某些部分中,我想得到一个列表,列出在某个aggreggate中遇到的
所有不同的简单对象。我们正在大量使用automapper,但到目前为止我还没有成功地将其映射到地图上。可能LINQ查询是更好的选择吗?您将如何解决此问题?假设您拥有的是:
ComplexBO aggregate = ...
那么你只需要:
var objects = aggregate.ObjectList.Select(x => x.SimpleBOField).Concat(
new[] {aggregate.SimpleBOField, aggregate.Object.SimpleBOField }
).Distinct().ToList();
这将为您提供不同的对象引用;如果需要不同的值对,请重写Equals()
/GetHashCode()
,或作弊:
var objects = aggregate.ObjectList.Select(x => x.SimpleBOField).Concat(
new[] {aggregate.SimpleBOField, aggregate.Object.SimpleBOField }
).Select(
x => new {x.SimpleBOField.Field1, x.SimpleBOField.Field2}
).Distinct().Select(
x => new SimpleBO {Field1 = x.Field1, Field2 = x.Field2}
).ToList();
根据定义,每个SimpleBO
都是不同的:除非覆盖相等操作(和GetHash
),否则引用对象具有“引用标识”。看起来不错,你认为我应该使用这种方法而不是automapper吗?为什么?@Hohhi调整以进行补偿。我不相信Automapper是设计来做你想做的事情的。你认为逻辑复杂到可以称之为映射吗?@Hohhi嗯,这不完全是一个标准投影!
var objects = aggregate.ObjectList.Select(x => x.SimpleBOField).Concat(
new[] {aggregate.SimpleBOField, aggregate.Object.SimpleBOField }
).Select(
x => new {x.SimpleBOField.Field1, x.SimpleBOField.Field2}
).Distinct().Select(
x => new SimpleBO {Field1 = x.Field1, Field2 = x.Field2}
).ToList();