2014-09-14 3 views
2

나는 다음과 같은 클래스가 :는 중첩 된 쿼리를 만들려면

public class A 
{ 
    public int Id {get;set;} 
    public string Name {get; set;} 
    public ICollection<B> Bs {get; set;} 
} 

public class B 
{ 
    public int Id {get;set;} 
    public string Name {get; set;} 
    public ICollection<C> Cs {get; set;} 
} 

public class C 
{ 
    public int Id {get;set;} 
    public string Name {get; set;} 
} 

이러한 ViewModels가 :

public class AViewModel 
{ 
    public int Id {get;set;} 
    public string Name {get; set;} 
    public ICollection<BViewModel> BViewModels {get; set;} 
} 
public class BViewModel 
{ 
    public string Name {get; set;} 
    public ICollection<CViewModel> CViewModels {get; set;} 
} 
public class CViewModel 
{ 
    public string Name {get; set;} 
} 

나는 linq to entity 쿼리를 작성하려면 (Fluent API)를 A 개체를 찾을 수 Id에 의해 BViewModel의 목록을 갖는 AViewModel이고 각각 ​​BViewModelCViewModels의 목록을 포함하며, 다음 쿼리를 작성했지만 약간의 오류가 있습니다 :

_uow.Repository<A>() 
       .All() 
       .Include("Bs") 
       .Include("Bs.Cs") 
       .Select(a => new AViewModel 
       { 
        Name = a.Name, 
        Id = a.Id, 
        (ICollection<BViewModel>) 
        a.Bs 
        .SelectMany(
        t => a.Bs 
         .Select(r => new BViewModel() 
        { 
         Name = r.Name 
         Cs = 
         (ICollection<CViewModel>) 
         t.Cs.SelectMany(y => new CViewModel() 
         { 
          Name = y.Name 
         }) 
        } 
        ) 
       ) 
       } 
       ).FirstOrDefault(a => a.Id == 5); 

어떻게 할 수 있습니까?

답변

3

Select으로, 캐럿 유형을 (ICollection)으로 바꾸고 ToList()으로 바꾸어보세요.

_uow.Repository<A>() 
    .All() 
    .Select(a => new AViewModel 
    { 
     Id = a.Id, 
     Name = a.Name, 
     Bs = a.Bs.Select(b => new BViewModel 
     { 
      Id = b.Id, 
      Name = b.Name, 
      Cs = b.Cs.Select(c => new CViewModel 
      { 
       Id = c.Id, 
       Name = c.Name 
      }).ToList() 
     }).ToList() 
    }) 
    .FirstOrDefault(a => a.Id == Id); 
+0

프로젝트를 시작하기 전에 필터링하지 않아야합니까? (조금 성능이 좋지는 않을 것입니다.하지만 쿼리 공급자가 최적화했을지라도 여전히 그렇습니다)? –

+0

@LewsTherin, OP 코드는 마지막 부분이 아닌 다른 필터를 보여주지 않습니다 .. 'FirstOrDefault' –

+0

넵 ... 알아요 ........... –

관련 문제