我有一个简单的 Web MVC 应用程序,使用数据库优先 Entity Framework 。我正在从表中检索信息。它非常慢。
我有两个问题:
当我使用 SQL Server Profiler 查看该查询时,它将该查询显示为
Select
查询,其中的 from 子句是另一个选择查询。我不确定为什么它使用另一个选择而不是表名称。这会减慢查询速度吗?当我检索行时,它会为每行调用数据库,从而减慢进程。它使用表中的键并重新查询数据库中的每一行。为什么它要为每一行调用数据库?第一个查询没有返回所有行吗?
下面是我的代码和 SQL Server Profiler 结果。
代码:
List<FanDetail> fans = db.FanDetails.ToList();
foreach (var item in fans)
{
FanSummaryViewModel add = new FanSummaryViewModel()
{
Part_No = item.Part_No,
}
}
SQL Server Profiler 查询结果:
SELECT
[Extent1].[Part_No] AS [Part_No]
FROM
(SELECT
[FanDetails].[Part_No] AS [Part_No]
FROM
[dbo].[FanDetails] AS [FanDetails]) AS [Extent1]
For Each 上的 SQL 探查器结果:
exec sp_executesql N'SELECT TOP (1)
[Extent1].[Part_No] AS [Part_No]
FROM (SELECT
[FanDetails].[Part_No] AS [Part_No]
FROM [dbo].[FanDetails] AS [FanDetails]) AS [Extent1]
WHERE [Extent1].[Part_No] = = @p__linq__0',N'@p__linq__0 varchar(8000)',@p__linq__0='00405635'
如果我需要提供更多详细信息,请告诉我。
我是 EF 的新手,并且已经致力于解决此性能问题一段时间了。
最佳答案
您应该能够在单个查询中实现所有查询和投影:
List<FanSummaryViewModel> fans = db.FanDetails
.Select(item => new FanSummaryViewModel
{
Part_No = item.Part_No
})
.ToList();
ToList 之前的 Select 语句将帮助解析器创建一个适当范围的查询,并且只会返回引用的字段,并在枚举列表时为每一行创建一个新对象,这就是 ToList 语句所实现的目标。
您还应该直接针对数据库检查生成的 Sql 的查询性能,看看问题是否仅与数据库有关,您可以通过索引来修复该问题。
关于c# - Entity Framework 多次调用 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38342172/