次のテーブルを持つデータベースがあります。
dbo.Administrator
dbo.Application
dbo.AdminApplication
dbo.Proficiency
dbo.ProficiencyLevel
- 管理者には、1から多数のアプリケーションが含まれます。アプリケーションには多くの管理者が含まれています
- アプリケーションには1から多数の習熟度が含まれています
- 習熟度には、1から多数の習熟度レベルが含まれます
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ステートメントでこれを行う方法を理解できませんでした。何かご意見は?