2011-10-13 44 views
3

让我们说我们有一个简单的业务对象:地图部件列表<T>

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;} 
} 

SomeClass的本身具有参考SimpleBO:

class SomeClass 
{ 
    public SimpleBO SimpleBOField {get;set} 
} 

现在在我的程序的某些部分,我想获得一个的列表简单的物体在某个集合体内遇到。我们正在大量使用automapper,但迄今为止我还没有设法映射它。可能是一个LINQ查询是一个更好的选择?你会如何解决这个问题?

+1

作为定义的每个'SimpleBO'是不同:除非覆盖平等操作(和'GetHash')然后引用对象具有“参考身份“。 – Richard

回答

1

假设你拥有的是:

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

这似乎很好,你认为我应该使用这种方法,而不是automapper,为什么? –

+0

@Hohhi调整补偿。我不相信Automapper是专门用来做你想做的事情的。 –

+0

你认为这个逻辑是复杂的称为映射吗? –

相关问题