2017-12-27 10 views
0

私はEvaluationRoundsが特定の学生と必要なアプリケーションを作成しています。関連するエンティティを複数のブランチおよび複数のレベルで読み込む

すべてはプロジェクトから始まります。プロジェクトには多くのグループがあります。グループには多くのメンバーがいますが、1人のメンバーも多くのグループに属しています。これは結合表によって行われますProjectGroupMembers一方、プロジェクトは多くの評価ラウンドを持っています。

現在、私はこのLINQ文を持っている:

from r in _context.EvaluationRounds.Include(e => e.EvaluationRoundProject.ProjectGroups.Select(pg => pg.Persons)) 
            .Include(e => e.Evaluations) 
    join g in _context.ProjectGroups on r.ProjectId equals g.ProjectId 
    join m in _context.ProjectGroupMembers on g.ProjectGroupId equals m.GroupId 
    where m.PersonId == studentId && r.EvaluationRoundStartTime < DateTime.Now && r.EvaluationRoundEndTime > DateTime.Now 
    select r 

我々はすぐに我々がリストを持っているようdbcontextを処分するために使用してステートメントを使用します。

EvaluationRoundProjectとその親類にEvaluationRoundsが搭載されていないという問題があります。これは私たちが得るものです:

'((System.Data.Entity.DynamicProxies.EvaluationRound_7400F2ED13550F1E92655A802808E4B94D454A30979C80D0EEED31D0CB7D7005)(新しいSystem.Collections.Generic.Mscorlib_CollectionDebugView(activeEvaluationrounds).Items [0]))EvaluationRoundProject' は投げました型 'System.ObjectDisposedException'

の例外は、私が試してみました:

from r in _context.EvaluationRounds.Include("EvaluationRoundProject").Include(e => e.EvaluationRoundProject.ProjectGroups.Select(pg => pg.Persons)).Include(e => e.Evaluations) 
    join g in _context.ProjectGroups on r.ProjectId equals g.ProjectId 
    join m in _context.ProjectGroupMembers on g.ProjectGroupId equals m.GroupId 
    where m.PersonId == studentId && r.EvaluationRoundStartTime < DateTime.Now && r.EvaluationRoundEndTime > DateTime.Now 
    select r 

とも

from r in _context.EvaluationRounds.Include(a => a.EvaluationRoundProject).Include(e => e.EvaluationRoundProject.ProjectGroups.Select(pg => pg.Persons)).Include(e => e.Evaluations) 
    join g in _context.ProjectGroups on r.ProjectId equals g.ProjectId 
    join m in _context.ProjectGroupMembers on g.ProjectGroupId equals m.GroupId 
    where m.PersonId == studentId && r.EvaluationRoundStartTime < DateTime.Now && r.EvaluationRoundEndTime > DateTime.Now 
    select r 

編集:これはコード

using (_context = new PeerEvaluationContext()) 
{ 
    var activeEvaluationrounds = from r in _context.EvaluationRounds.Include(e => e.EvaluationRoundProject.ProjectGroups.Select(pg => pg.Persons)).Include(e => e.Evaluations) 
             join g in _context.ProjectGroups on r.ProjectId equals g.ProjectId 
             join m in _context.ProjectGroupMembers on g.ProjectGroupId equals m.GroupId 
             where m.PersonId == studentId && r.EvaluationRoundStartTime < DateTime.Now && r.EvaluationRoundEndTime > DateTime.Now 
             select r; 
    return activeEvaluationrounds.ToList(); 
} 

編集3を使用して、全体である::評価はまたevaluationround

EDIT2にロードされませんが、この問題は怠惰なために発生しますローディングが使用されます。しかし、私はインターネットを見て行って、彼らはinclude部分がこれを処理すると述べた。

+0

.ToList()? –

+0

すでにそれを行って、質問に情報を追加しました – freshrebel

答えて

0

遅延読み込みのためにエラーが発生したと思われます。 EvaluationRoundまたはEvaluationRoundProjectのエンティティはvirtualのナビゲーションプロパティを持ち、EFは既に_contextが処分された後にデータを読み込もうとしています。したがって、別のクラスを使用してクエリを選択しようとしますか?

var activeEvaluationrounds = from r in _context.EvaluationRounds.Include(e => e.EvaluationRoundProject.ProjectGroups.Select(pg => pg.Persons)).Include(e => e.Evaluations) 
    join g in _context.ProjectGroups on r.ProjectId equals g.ProjectId 
    join m in _context.ProjectGroupMembers on g.ProjectGroupId equals m.GroupId 
    where m.PersonId == studentId && r.EvaluationRoundStartTime < DateTime.Now && r.EvaluationRoundEndTime > DateTime.Now 
    select new EvaluationRoundDto 
    { 
     EvaluationRoundId = r.EvaluationRoundId, 
     ProjectId = r.ProjectId 
     //etc. 
    }; 

私はあなたがvirtualナビゲーションのプロパティを確認すべきだと思うとどこ彼らはすでに配置されたコンテキストの後に使用されています。

+0

答えに感謝します。ほとんどの場合、評価は必要ですがプロジェクトは必要ないため、実際には遅延読み込みが使用されます。私はこのソリューションを試してみるつもりですが、ここでは[link](https://msdn.microsoft.com/en-us/library/jj574232(v=11113).aspx)のように、'includeの部分'は、あなたがそれらにアクセスできるように、プロジェクトを評価環境にロードします。だから私はこれで十分だろうと思ったのですが、なぜそうではありませんか? – freshrebel

+0

これを試してみましたが、System.NotSupportedExceptionというエラーが表示されます。 'エンティティまたは複合型' AP.PeerEvaluations.DAL.Contexts.EvaluationRound 'は、LINQ to Entitiesクエリで構築できません。'' – freshrebel

+0

「新しいEvaluationRoundDtoを選択」のようなクエリを選択するには、新しいクラスを作成する必要があります。エンティティクラスを使用しません。 – lucky

関連する問題