Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将聚合的部分映射到列表<;T>;_C#_Linq_Automapper - Fatal编程技术网

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();