【问题标题】:Many to Many EF LINQ多对多 EF LINQ
【发布时间】:2013-01-29 12:46:21
【问题描述】:

我有一个包含以下表格的数据库:

dbo.Administrator

dbo.Application

dbo.AdminApplication

dbo.Proficiency

dbo.ProficiencyLevel
  • 管理员包含 1 到多个应用程序。应用程序包含许多管理员
  • 应用程序包含 1 到多个 Proficiency(s)
  • 熟练度包含 1 到多个 ProficiencyLevels

首先使用 EF 代码,AdminApplication 未映射为实体,这就是导致我出现问题的原因。我想回答的是:

“返回名为“danhickman”的管理员的所有熟练程度

在 SQL 中,查询如下所示:

Select * from dbo.ProficiencyLevel pl
inner join dbo.Proficiency p on p.Id = pl.ProficiencyId
inner join dbo.Application a on a.Id = p.ApplicationId
inner join dbo.AdminApplication aa on aa.ApplicationId = a.Id
inner join dbo.Administrator ad on ad.Id = aa.AdministratorId
where ad.Name = 'danhickman'

我用以下 C# 代码解决了这个问题:

        public IQueryable<LobGame.Model.ProficiencyLevel> GetAllByAdminName(string administratorName)
    {
        var context = this.DbContext as LobGameDbContext;
        var admin = context.Administrators.Include(i => i.Applications).Include("Applications.Proficiencies").Include("Applications.Proficiencies.ProficiencyLevels").Single(o => o.Name == administratorName);
        List<LobGame.Model.ProficiencyLevel> list = new List<ProficiencyLevel>();
        foreach (var app in admin.Applications)
        {
            foreach (var prof in app.Proficiencies)
            {
                list.AddRange(prof.ProficiencyLevels);
            }
        }
        return list.AsQueryable();
    }

我不得不 foreach 并添加到列表中,这让我很烦恼。我无法在单个 LINQ 语句中找到一种方法来执行此操作。有什么想法吗?

【问题讨论】:

    标签: linq ef-code-first many-to-many


    【解决方案1】:

    使用查询语法的另一个选项。这在幕后使用了 SelectMany。

    var queryableList = 
      from admin in context.Administrators
      where admin.Name = administratorName
      from app in admin.Applications
      from proficiency in app.Proficiencies
      from level in proficiency.ProficiencyLevels
      select level;
    

    注意:这将是一个 IQueryable,因此您不需要 .ToList().AsQueryable()。

    【讨论】:

      【解决方案2】:
           return context.Administrators
                         .Single(o => o.Name == administratorName)
                         .Applications
                         .SelectMany(app => app.Proficiencies)
                         .SelectMany(prof => prof.ProficiencyLevels)
                         .ToList()
                         .AsQueryable();
      

      【讨论】:

        【解决方案3】:

        使用SelectMany():

        var queryableList = 
          context.Administrators.Single(o => o.Name.Equals(administratorName))
                                .SelectMany(adm => adm.Applications.Select(app => app.Proficiencies.SelectMany(prof => prof.ProficiencyLevels))).ToList().AsQueryable();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多