Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多个连接的情况下,是延迟加载、急切加载还是显式加载?_C#_Linq_Entity Framework 4_Linq To Entities_Entity Framework 5 - Fatal编程技术网

C# 在多个连接的情况下,是延迟加载、急切加载还是显式加载?

C# 在多个连接的情况下,是延迟加载、急切加载还是显式加载?,c#,linq,entity-framework-4,linq-to-entities,entity-framework-5,C#,Linq,Entity Framework 4,Linq To Entities,Entity Framework 5,我是实体框架的初学者。我需要从8个不同的表中获取许多记录(有时甚至达到数百万条)。我目前正在linq中加入这些表,并将它们转换为list。(所以我在这里进行显式加载)我知道在这种情况下,为了获得更好的性能,是否更适合使用渴望加载。任何帮助都将不胜感激。我的问题是: List<FarmerDetailsReport> fdr = (from fp in mstfp join pd in personalDetails on fp.personDetails.Id equals

我是
实体框架
的初学者。我需要从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

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


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

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

因此,我将在数据库中创建一个SP

更新 如果要执行SP并在POCO对象中返回结果,一个好的选择是使用。SP的执行非常简单:

using Dapper;

using (var connection = MyConnectionFactory.GetConnection()) {
    connection.Open();
    var data = cnn.Query<MyPocoObject>(
        "spMySp",
        new { MyParameter = 1 }, 
        commandType: CommandType.StoredProcedure
    );
    return data;
}
使用简洁;
使用(var connection=MyConnectionFactory.GetConnection()){
connection.Open();
var data=cnn.Query(
“spMySp”,
新的{MyParameter=1},
commandType:commandType.StoredProcess
);
返回数据;
}

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

实际上,我的项目首先使用代码实现了实体框架。那么,首先使用代码实现SP不是很复杂吗?@Saket为什么要使用实体框架来执行SP?用点别的吧。我将使用一个选项更新我的答案。我可以在实体框架中首先使用代码创建索引视图吗?不,是在数据库中创建的视图。它看起来像一个表到实体的框架,但实际上可以是不同表的连接(就像在查询中一样)。
using Dapper;

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