2013-03-11 62 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