c# - Entity Framework 多次调用 SQL Server

标签 c# sql-server asp.net-mvc entity-framework

我有一个简单的 Web MVC 应用程序,使用数据库优先 Entity Framework 。我正在从表中检索信息。它非常慢。

我有两个问题:

  1. 当我使用 SQL Server Profiler 查看该查询时,它将该查询显示为 Select 查询,其中的 from 子句是另一个选择查询。我不确定为什么它使用另一个选择而不是表名称。这会减慢查询速度吗?

  2. 当我检索行时,它会为每行调用数据库,从而减慢进程。它使用表中的键并重新查询数据库中的每一行。为什么它要为每一行调用数据库?第一个查询没有返回所有行吗?

下面是我的代码和 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/

相关文章:

asp.net-mvc - 如何在ReactJs中使用路由?

c# - asp.net 应用程序在本地主机上识别用户,但在没有硬编码用户名/密码的情况下无法在服务器上识别用户

c# - 如何在循环中处理异常并不断迭代?

sql - 使用TSQLUNIT进行SQL单元测试: don't you need to duplicate your SQL code?

c# - 添加时出现 DbUpdateConcurrencyException

asp.net-mvc - ASP.Net MVC - HTTP 状态代码(即 303、401、404 等)

c# - VS2012、C#、Monogame - 加载 Assets 异常

c# - 制作一个随机整数数组

c# - 如何从选择查询中计算重复记录

asp.net-mvc - MVC 3 Ajax.beginform 提交 - 导致完全回发