c# - 使用linq to实体进行嵌套查询

标签 c# entity-framework linq-to-entities ef-fluent-api

我有以下类(class):

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

以及这些ViewModel:

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实体查询(Fluent API)来通过其Id查找A对象 code> 结果是一个带有 BViewModel 列表的 AViewModel,每个 BViewModel 也包含一个 CViewModels 列表, 我编写了以下查询,但有一些错误:

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

我怎样才能做到这一点?

最佳答案

尝试将 SelectMany 替换为 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);

关于c# - 使用linq to实体进行嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25831104/

相关文章:

c# - 导航属性为空

C# 遍历json

c# - 使用委托(delegate)的新实例注销事件

C# 上下文菜单处理程序

c# - MousEventArgs.Location 和 Cursor.Position 的区别

c# - DeploymentItem 在单独的程序集中破坏了 EntityFramework 单元测试

c# - EF 5 中的表值函数?

c# - 获取 List<class> 形式的子集合

c# - 比较linq中的日期

c# - 为什么 Select、Where 和 GroupBy 的这种组合会导致异常?