1

現在の MVC4.0 プロジェクトでは、Entity Framework 4.1 データベースの最初のモデルを使用しています。

この構造の一部には、次の表が含まれます

compGroupData SurveyData セカンダリデータ

compGroupData と SurveyData はデータベースで結合されていません

SecondaryData は、外部キーを介して 1 対 1 の関係で SurveyData に結合されます

私のプロジェクトでは、次のように定義されたクラス ComparisonWithData があります。

public class ComparisonWithData
{
    public compGroupData compgrp { get; set; }
    public SurveyData surveydata { get; set; }
    public ComparisonWithData()
    {
        compgrp = new compGroupData();
        surveydata = new SurveyData();
    }
}

これにより、特定の比較グループとこれに一致するデータの結果セットが得られます。

過去に、次のクエリを使用してこのデータを取得しました。

    List<ComparisonWithData> comparisonwithdata  = ((from compgrp in db.compGroupDatas
                       where compgrp.grpYear == rptyear && compgrp.CompGroupID == ccompgrp.CompGrpID
                       join surveydata in db.SurveyDatas on new { compgrp.companyid, SurveyYear = (Int32)compgrp.SurveyYear } equals new { companyid = surveydata.companyid, SurveyYear = surveydata.surveyyear }
                       select new ComparisonWithData
                       {
                           compgrp = compgrp,
                           surveydata = surveydata,


                       }
                       )).ToList();

最近のデータの変更により、SecondaryData も参照する必要がありますが、レコードの数が多いため、Lazy ではなく Eagerly をロードするためにこれが本当に必要です。(ループ中の遅延読み込みにより、何千もの DB 呼び出しが発生します)

私は、調査データで「インクルード」メソッドを使用するだけでなく、最初のクエリを ObjectQuery としてキャストし、それをインクルードすることも検討しました。

最初のメソッドは熱心な読み込みを行わず、2 番目のメソッドは結果として常に null オブジェクトを返すようです。

SurveyData の SecondaryData を Eager ロードする方法はありますか、それとも別のアプローチを一緒に検討する必要がありますか。

これに関する私の唯一の制限は、.Net 4.5 の制限により EF5 に移行できないことです。

どんな援助でも大歓迎です。

ありがとうございました。

4

1 に答える 1

0

最初に匿名オブジェクトSecondaryDataに射影して、その射影でも使用し、この結果を具体化してから、最終結果オブジェクトに再度射影することができます。EF コンテキストが提供する自動リレーションシップ修正はsurveyData.SecondaryDataComparisonWithDataオブジェクトのナビゲーション プロパティを設定する必要があります (クエリで変更追跡を無効にしない限り)。

var data = (( // ... part up to select unchanged ...
           select new // anonymous object
           {
               compgrp = compgrp,
               surveydata = surveydata,
               secondarydata = surveydata.SecondaryData
           }
           )).AsEnumerable();
           // part until here is DB query, the rest from here is query in memory

List<ComparisonWithData> comparisonwithdata =
           (from d in data
           select new ComparisonWithData
           {
               compgrp = d.compgrp,
               surveydata = d.surveydata
           }
           )).ToList();
于 2013-01-09T22:13:08.040 に答える