4

長年の潜伏者、初投稿、EF4 と MVC3 の新規学習。

この場合、正しいデータ読み込み戦略を使用していることを確認するための支援と、クエリの詳細を最終決定するための支援が必要です。私は現在、約 10 個のテーブル (すべて FK 関係がある) からの少量のデータを必要とする「ダッシュボード」ビューのために、ここで概説した熱心な読み込みアプローチを使用しています。

            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 の全体的なサイズと結合の数について非常に懸念しており、全体として別のデータ読み込みアプローチが必要になる可能性があると考えています (明示的な読み込み? 複数の QueryObjects? POCO?)。

これらの残りのニーズを解決し、最高のパフォーマンスを確保する方法についての入力、指示、またはアドバイスは大歓迎です。

4

2 に答える 2

1

クエリのサイズと結果セットのサイズに関する懸念は具体的です。

@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)
                              ... 
                          });
于 2011-06-28T07:28:31.370 に答える
0

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

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

于 2011-06-27T20:12:03.497 に答える