Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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# EF的性能问题包括_C#_Sql_Entity Framework 5 - Fatal编程技术网

C# EF的性能问题包括

C# EF的性能问题包括,c#,sql,entity-framework-5,C#,Sql,Entity Framework 5,我在一个我无法控制数据库结构的项目中。我已经从数据库中创建了我的模型,并且在下面的所有表中都有外键。除了用户表之外,每个表中大约有500k到1000k行,它们相当宽 使用EF5执行此查询需要两秒钟: var customerEngage = ctx.Customer_TB .Include(c => c.Insurance_TB) .Include(c => c.Insurance_TB

我在一个我无法控制数据库结构的项目中。我已经从数据库中创建了我的模型,并且在下面的所有表中都有外键。除了用户表之外,每个表中大约有500k到1000k行,它们相当宽

使用EF5执行此查询需要两秒钟:

 var customerEngage = ctx.Customer_TB
                        .Include(c => c.Insurance_TB)
                        .Include(c => c.Insurance_TB.Select(i => i.H80Row_TB))
                        .Include(c => c.Insurance_TB.Select(i => i.WinsureRow_TB))
                        .Include(c => c.Insurance_TB.Select(i => i.User_TB))
                        .Include(c => c.Insurance_TB.Select(i => i.User_TB.Department_TB))
                        .SingleOrDefault(c => c.IDCustomer == myID);
相关表中不一定有任何行

我可以在没有任何性能问题的情况下执行此SQL查询:

SELECT * 
from dim.Customer_TB c
    INNER JOIN fact.insurance_tb i on i.IDCustomer = c.IDCustomer
    LEFT JOIN fact.H80Row_TB h80 on h80.IDInsurance = i.IDInsurance
    LEFT JOIN fact.WinsureRow_TB winsure on winsure.IDInsurance = i.IDInsurance
    LEFT JOIN eb.User_TB a on i.LockedByUserID = a.IDUser
    LEFT JOIN eb.Department_TB dept on dept.IDDepartment = a.IDDepartment
WHERE c.IDCustomer = myID

首先,我的EF查询是否有问题?我可以创建一个SP,但如何从该结果集中填充POCO?

将您的SingleOrDefault更改为Where-您的SingleOrDefault不一样,它最多可以确保一行


您还可以检查sql事件探查器和/或
var sql=((System.Data.Objects.ObjectQuery)customerEngage.ToTraceString()发出的sql

您不需要所有这些包含

var customerEngage = ctx.Customer_TB
                        .SingleOrDefault(c => c.IDCustomer == myID);

应该做这项工作。

我在许多ORM中看到过这种情况。。这通常是因为类型不匹配。通常,它们是
varchar
nvarchar
。ORM选择作为
sp_executesql
调用执行,这些调用中的隐式转换使查询运行了难以置信的时间。如果您可以启动SQL跟踪并捕获正在发送的实际查询。。即使您从ManagementStudio运行相同的查询,您自己也会注意到。是的。如果我也从SQL跟踪中运行查询,则需要花费很长时间。你知道我能做些什么吗?@Simon从ORM中看到任何
sp_executesql
都是非常罕见的,因为ORM可以构造和执行非常简单的命令文本,并且
sp_executesql
可以接受的命令的大小有一个令人烦恼的限制
sp_executesql
在存储过程需要执行其动态构造的sql时更常见(例如,接受多个条件的“搜索”过程)事实上,我已经更改了搜索条件,生成的SQL很快,因此它一定与您提到的类型不匹配有关。@MarcGravel我已经看到NHibernate和EF查询在服务器上以
sp_executesql
的形式在跟踪打开的情况下执行。。你知道是什么原因吗?以前是where,但我正试图缩小问题范围,所以现在我只搜索唯一的主键。只有一排。我已经运行了Sql Profiler,生成的Sql需要永远运行。即使禁用了延迟加载?是的,这很快,但我需要包含的表中的数据:)你有它。例如,只需编写customerEngage.H80Row_TB。