2

次のテーブルを持つデータベースがあります。

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ステートメントでこれを行う方法を理解できませんでした。何かご意見は?

4

3 に答える 3

3

クエリ構文を使用する別のオプション。これは、内部で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()は必要ありません。

于 2013-02-13T21:30:23.627 に答える
2
     return context.Administrators
                   .Single(o => o.Name == administratorName)
                   .Applications
                   .SelectMany(app => app.Proficiencies)
                   .SelectMany(prof => prof.ProficiencyLevels)
                   .ToList()
                   .AsQueryable();
于 2013-02-13T20:38:56.183 に答える
1

使用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();
于 2013-02-13T20:40:21.177 に答える