我有一个包含以下表格的数据库:
dbo.Administrator
dbo.Application
dbo.AdminApplication
dbo.Proficiency
dbo.ProficiencyLevel
- 管理员包含 1 到多个应用程序。应用程序包含许多管理员
- 应用程序包含 1 到多个 Proficiency(s)
- Proficiency 包含 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 语句中找到一种方法来执行此操作。有什么想法吗?