在多个连接的情况下,延迟加载,急切加载或显式加载?

时间:2014-02-14 07:59:45

标签: c# linq entity-framework-4 linq-to-entities entity-framework-5

我是entity framework的初学者。我需要从8个不同的表中获取许多记录(有时甚至达到数百万)。我目前正在linq加入此表并将其转换为list。 (所以我在这里进行显式加载)我知道在这种情况下,为了获得更好的性能,是否更适合使用预先加载。任何帮助将不胜感激。这是我的疑问:

List<FarmerDetailsReport> fdr = 
    (from fp in mstfp join pd in personalDetails on fp.personDetails.Id equals pd.Id
    join ic in identityCertificate on fp.identityCertificate.Id equals ic.Id 
    join pid in pacsInsuranceData on fp.pacsInsuranceData.Id equals pid.Id into temp
    from pid in temp.DefaultIfEmpty()
    join bd in bankDetails on fp.bankDetails.Id equals bd.Id
    join cd in contactDetails on fp.contactDetails.Id equals cd.Id
    join id in incomeDetails on fp.incomeDetails.Id equals id.Id into tmp
    from id in tmp.DefaultIfEmpty()
    join ua in user

fp.UserId上的属性等于ua.EmailID

where ((ua.CompanyName == companyName ) && (cd.District == model.DistrictForProfileMIS ) && (cd.Block == model.BlockForProfileMIS) && (bd.bankName == model.BankForProfileMIS ) && Status == "Active")

select new FarmerDetailsReport { .......... }).ToList();

3 个答案:

答案 0 :(得分:1)

在我看来,在实体框架中以这种方式连接大量表的更好方法是在数据库中创建一个视图(索引视图)并进行查询。我不是数据库专家,但它应该提高数据库和代码的性能......

当然,如果数据库发生变化,您可以更改视图,而无需更改代码。

答案 1 :(得分:1)

如果性能至关重要,我不会使用Linq查询。原因是,您不知道EF将创建哪种查询。是的,EF在创建高效查询方面非常出色,但如果您有一个特定的情况,其中性能至关重要,那么自己动手(如果您是经验丰富的SQL开发人员)仍然是最佳选择。

所以我会在数据库中创建一个SP。

更新

如果要执行SP并在POCO对象中返回结果,可以使用Dapper。 SP的执行非常简单:

using Dapper;

using (var connection = MyConnectionFactory.GetConnection()) {
    connection.Open();
    var data = cnn.Query<MyPocoObject>(
        "spMySp",
        new { MyParameter = 1 }, 
        commandType: CommandType.StoredProcedure
    );
    return data;
}

答案 2 :(得分:0)

如果您正在使用实体框架,那么您希望使用它的可能性,而不是回到存储过程。使用包含语句(Eager Loading)或Explizit Loading(.Load())来实现目标。这就是EF的用途。