2013-03-11 38 views
0

我有一個兩級嵌套的子集合,我投影到DTO中。我的問題也適用於常規父 - >兒童的關係:EF Linq嵌套集合的投影 - 建立關係

// There are two types on Parent and two types of Child classes, 
// one is EF model, and another is DTO (here I show only one, for simplicity) 
public class Parent 
{ 
    public int Id {get;set;} 
    public IEnumerable<Child> Children {get;set;} 
} 

public class Child 
{ 
    public int Id {get;set;} 
    public Parent Parent {get;set;} 
} 

var list = context.Set<Parent>().Select(p=> new DTO.Parent 
    { 
     Id = p.Id 
     Children = (p.Children.Select(c=> new DTO.Child 
      { 
       Id=c.Id, 
       Parent = ? 
      })) 
    }); 

是否有可能分配一個父引用子對象,而這樣做的投影?

+0

當然,這不是目的嗎? 'Parent = p.Id' – 2013-03-11 14:49:23

+0

@BeratBilgin我不明白你到底在說什麼...... – Goran 2013-03-11 16:43:09

回答

0

我不認爲有可能直接在查詢中設置Parent。所以,這裏只是另一種解決方法,一種「DTO關係修正」:

public class Parent 
{ 
    public int Id {get;set;} 

    private IEnumerable<Child> _children; 
    public IEnumerable<Child> Children 
    { 
     get { return _children; } 
     set 
     { 
      _children = value; 
      if (_children != null) 
       foreach (var child in _children) 
        child.Parent = this; 
     } 
    } 
} 
1

您可以通過eagar裝載的孩子做映射與Automapper

Mapper.CreateMap<Parent, DTO.Parent>(); 
Mapper.CreateMap<Child, DTO.Child>(); 
var list = Mapper.Map<IEnumerable<DTO.Parent>>(context.Set<Parrent>() 
                 .Include(p => p.Children) 
                 .AsEnumerable()); 

Automapper將每個實體映射到DTO,併爲每個DTO孩子提供DTO父實例的引用。

+0

是的,但是這就像手動循環遍歷完整的樹,而不是我所問的。你的答案是使用Linq2Ent投影不能完成的嗎? – Goran 2013-03-11 16:42:16