4

長時間のlurker、初回投稿、新しく学習したEF4とMVC3。EF4でのデータ読み込み方針/構文

私はこのケースで正しいデータ読み込み戦略を使用していることを確認し、クエリの詳細を確定するのに役立つ助けが必要です。私は現在、約10テーブル(すべてFKの関係を持っている)から少量のデータを必要とする「ダッシュボード」ビューのために、hereを概説した熱心な読み込み方法を使用しています。

  var query = from l in db.Leagues 
       .Include("Sport") 
       .Include("LeagueContacts") 
       .Include("LeagueContacts.User") 
       .Include("LeagueContacts.User.UserContactDatas") 
       .Include("LeagueEvents") 
       .Include("LeagueEvents.Event") 
       .Include("Seasons") 
       .Include("Seasons.Divisions") 
       .Include("Seasons.Divisions.Teams") 
       .Where(l => l.URLPart.Equals(leagueName)) 
         select (l); 

      model = (Models.League) query.First(); 

しかし、私は解決できなかったデータのフィルタリング、並べ替え、整形を追加する必要があります。

  • いくつかの子オブジェクトにはまだ追加のフィルタリングが必要ですが、私はまだ構文や最良のアプローチを理解することができませんでした。例: "TOP 3 LeagueEvents.Event WHERE StartDate> = getdate()ORDER BY LeagueEvents.Event.StartDate"

  • フィールドの一部を並べ替える必要があります。例:ORDERBY Seasons.StartDate、LeagueEvents.Event.StartDate、LeagueContacts.User.SortOrderなど

  • このクエリで生成されたSQLの全体サイズと、私はalltogether異なるデータローディングアプローチを必要とするかもしれないことを考えています。(明示的なロード?複数QueryObjectsを?POCO?)

任意の入力、方向、またはこれらの残りのニーズを解決する方法についてのアドバイスだけでなく、最高のを確実にしますパフォーマンスは非常に高く評価されています。

答えて

1

質問のサイズについてのご心配、size of the result set are tangible

@ BrokenGlassによると、EFでは、インクルード時にフィルタリングや順序付けを行うことはできません。リレーションを整理またはフィルタリングする場合は、匿名タイプまたはカスタム(マップされていない)タイプのいずれかを使用する必要があります。

 var query = db.Leagues 
         .Where(l => l.URLPart.Equals(leagueName)) 
         .Select(l => new 
          { 
           League = l, 
           Events = l.LeagueEvents.Where(...) 
                .OrderBy(...) 
                .Take(3) 
                .Select(e => e.Event) 
           ... 
          }); 
+0

簡潔で注目に値する!あなたのコード例は、正確に私が達成しようとしていたものです。私はまたあなたのリンク関連の回答をupvotedだけでなく、完全に足跡とパフォーマンスに関する私の質問の残りの部分に答えた。ありがとう! –

0

EFではナビゲーションプロパティを使用して関連エンティティを選択的に読み込むことはできませんが、Include("Foo")を指定すると常にすべてFoosが読み込まれます。

Where()句を適用するフィルタとして、関連するエンティティごとに結合を行う必要があります。

関連する問題