Asp.net mvc 4 实体框架4.1在complext对象上加载

Asp.net mvc 4 实体框架4.1在complext对象上加载,asp.net-mvc-4,entity-framework-4.1,eager-loading,Asp.net Mvc 4,Entity Framework 4.1,Eager Loading,在当前的MVC4.0项目中,我使用实体框架4.1数据库优先模型 此结构的一部分包括下表 compGroupData 调查数据 二次数据 compGroupData和SurveyData未加入数据库 SecondaryData通过外键SurveyData.surveydatakey=SecondaryData.surveydatakey通过一对一关系连接到SurveyData 在我的项目中,我有一个类ComparisonWithData定义为: public class ComparisonWit

在当前的MVC4.0项目中,我使用实体框架4.1数据库优先模型

此结构的一部分包括下表

compGroupData 调查数据 二次数据

compGroupData和SurveyData未加入数据库

SecondaryData通过外键SurveyData.surveydatakey=SecondaryData.surveydatakey通过一对一关系连接到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();
随着最近数据的变化,我现在还需要引用第二个数据,但由于记录的数量太多,我确实需要急切地加载它,而不是懒惰地加载它。循环期间的延迟加载会导致数千个DB调用

我已经研究了在surveydata上使用Include方法,以及将初始查询转换为ObjectQuery并执行Include

第一个方法不急于加载,第二个方法似乎总是返回一个空对象

是否有一种方法可以加载SurveyData的第二个数据,或者我应该一起使用另一种方法

我唯一的限制是我不能升级到EF5,因为我们在.NET4.5上有一个限制

如蒙协助,将不胜感激


谢谢。

您可以先尝试投影到匿名对象中,然后在该投影中使用第二个数据,具体化此结果,然后再次投影到最终的结果对象中。EF上下文提供的自动关系修复应填充ComparisonWithData对象的导航属性surveyData.SecondaryData,只要您不在查询中禁用更改跟踪:

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();

我发现另一个帖子和这篇非常相似,效果非常好。唯一的区别是我并不是分两步完成的。在surveydata中加载secondarydata对象时,也会直接加载secondarydata。我希望有另一种更直接一点的方法,但由于这种方法有效,这是最好的答案。再次感谢你的帮助