Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.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# LINQ到实体查询优化-性能差_C#_Asp.net_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# LINQ到实体查询优化-性能差

C# LINQ到实体查询优化-性能差,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,在我的EF6应用程序中,到处都有一些性能非常差的查询。这里有一个查询需要将近3000毫秒才能执行。(本地主机到外部sql server) 很明显,这件事有点不对劲,可能是显而易见的。但我不知道那是什么 使现代化 由此生成的SQL是: SELECT TOP (10) [Project1].[C1] AS [C1], [Project1].[Id] AS [Id], [Project1].[FirstName] AS [FirstName], [Project

在我的EF6应用程序中,到处都有一些性能非常差的查询。这里有一个查询需要将近3000毫秒才能执行。(本地主机到外部sql server)

很明显,这件事有点不对劲,可能是显而易见的。但我不知道那是什么

使现代化 由此生成的SQL是:

SELECT TOP (10) 
    [Project1].[C1] AS [C1], 
    [Project1].[Id] AS [Id], 
    [Project1].[FirstName] AS [FirstName], 
    [Project1].[LastName] AS [LastName], 
    [Project1].[Name] AS [Name], 
    [Project1].[DueDateTime] AS [DueDateTime]
    FROM ( SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[DueDateTime] AS [DueDateTime], 
        [Extent2].[FirstName] AS [FirstName], 
        [Extent2].[LastName] AS [LastName], 
        [Extent3].[Name] AS [Name], 
        1 AS [C1]
        FROM  [dbo].[Activities] AS [Extent1]
        INNER JOIN [dbo].[Customers] AS [Extent2] ON [Extent1].[CustomerId] = [Extent2].[Id]
        INNER JOIN [dbo].[ActivityTypes] AS [Extent3] ON [Extent1].[ActivityTypeId] = [Extent3].[Id]
        WHERE (0 = [Extent1].[IsComplete]) AND ([Extent1].[AssignedUserId] = 037da3f4-99cc-4338-8b36-491ca0fcfcb1 /* @p__linq__0 */)
    )  AS [Project1]
    ORDER BY [Project1].[DueDateTime] ASC

首先,如果启用,则在上下文中打开懒散加载。。。表现很差,真的很差。如果启用,则将忽略包含

在您的示例中,当您在查询中使用某个实际类时,选择不是在SQL Server端完成的,而是通过C#完成的。这意味着它将对所有表执行联接操作,执行“选择*”,因为他不知道需要哪些字段,然后映射它。慢,真慢

    dash.UserActivities = db.Activities..Where(a => a.AssignedUserId == userId && a => !a.IsComplete).OrderBy(a => a.DueDateTime).Select( a => new {  
                Id = a.Id,
                CustomerFirstName = a.Customer.FirstName,
                CustomerLastName = a.Customer.LastName,
                ActivityType = a.ActivityType.Name,
                DueDateTime = a.DueDateTime
  }).Take(10).Select(
            a => new ActivityViewModel()
            {
                Id = a.Id,
                CustomerFirstName = a.CustomerFirstName,
                CustomerLastName = a.CustomerLastName ,
                ActivityType = a.ActivityType 
                DueDateTime = a.DueDateTime,
            }
        ).ToList();

正如@MarcinJuraszek在评论中所建议的,我们需要在本地执行这些查询,并在这里审核性能。使用tuning adviser,我们发现了许多改进的机会。

您是否检查了为您的查询生成的SQL?好吧,对于初学者,您可以删除两个
Include
语句,因为您没有在查询结果中投影任何一个集合。@Servy请查看上面的更新。我想您是想在那里回复@MarcinJuraszek,因为他是请求生成SQL的人。SQL查询看起来是正确的。您应该直接对数据库运行它,并验证执行时间和生成的执行计划。所有索引都正确吗?生成的SQL表明查询提供程序可以很好地支持他正在做的事情,并且只选择所需的列。确实有一些查询提供程序不支持此功能,但这一个显然支持。延迟加载在这里也不相关,因为他没有投射出包含可以延迟加载的属性的整个实体。不正确。看看问题中添加的生成的SQL。当我写我的答案时,SQL没有显示:)对不起,伙计们
    dash.UserActivities = db.Activities..Where(a => a.AssignedUserId == userId && a => !a.IsComplete).OrderBy(a => a.DueDateTime).Select( a => new {  
                Id = a.Id,
                CustomerFirstName = a.Customer.FirstName,
                CustomerLastName = a.Customer.LastName,
                ActivityType = a.ActivityType.Name,
                DueDateTime = a.DueDateTime
  }).Take(10).Select(
            a => new ActivityViewModel()
            {
                Id = a.Id,
                CustomerFirstName = a.CustomerFirstName,
                CustomerLastName = a.CustomerLastName ,
                ActivityType = a.ActivityType 
                DueDateTime = a.DueDateTime,
            }
        ).ToList();