gpt4 book ai didi

linq - 多对多 EF LINQ

转载 作者:行者123 更新时间:2023-12-02 08:43:06 27 4
gpt4 key购买 nike

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

dbo.Administrator

dbo.Application

dbo.AdminApplication

dbo.Proficiency

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

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

“返回名为“danhickman”的管理员的所有 ProficiencyLevels

在 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 语句中找到执行此操作的方法。有什么想法吗?

最佳答案

另一个使用查询语法的选项。这在幕后使用了 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()。

关于linq - 多对多 EF LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14862583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com