相关疑难解决方法(0)

由于派生表,实体框架很慢

我使用MySQL Connector/Net 6.5.4与LINQ实体,我经常得到糟糕的查询性能,因为实体框架生成使用派生表的查询.

这是我多次遇到的简化示例.在C#中,我写了一个这样的查询:

var culverCustomers = from cs in db.CustomerSummaries where cs.Street == "Culver" select cs;
// later...
var sortedCustomers = culverCustomers.OrderBy(cs => cs.Name).ToList();
Run Code Online (Sandbox Code Playgroud)

而不是像这样生成简单的查询:

SELECT cust.id FROM customer_summary cust WHERE cust.street = "Culver" ORDER BY cust.name
Run Code Online (Sandbox Code Playgroud)

实体框架使用派生表生成一个查询,如下所示:

SELECT Project1.id FROM (
    SELECT cust.id, cust.name, cust.street FROM customer_summary cust
    WHERE Project1.street = "Culver"
) AS Project1 -- here is where the EF generates a pointless derived table
ORDER BY Project1.name
Run Code Online (Sandbox Code Playgroud)

如果我解释两个查询,我得到第一个查询:

id, select_type, table, type, possible_keys, rows
1,  PRIMARY, …
Run Code Online (Sandbox Code Playgroud)

c# mysql linq-to-entities entity-framework database-performance

9
推荐指数
1
解决办法
1883
查看次数

实体框架为分页查询生成低效的SQL

我对一个实体有一个简单的分页linq查询:

var data = (from t in ctx.ObjectContext.Widgets
           where t.CampaignId == campaignId && 
                 t.CalendarEventId == calendarEventId
                 (t.RecurringEventId IS NULL OR t.RecurringEventId = recurringEventId)
           select t);

data = data.OrderBy(t => t.Id);

if (page > 0)
{
    data = data.Skip(rows * (page - 1)).Take(rows);
}

var l = data.ToList(); 
Run Code Online (Sandbox Code Playgroud)

我希望它生成类似于的SQL:

select top 50 * from Widgets w where CampaignId = xxx AND CalendarEventId = yyy AND (RecurringEventId IS NULL OR RecurringEventId = zzz) order by w.Id
Run Code Online (Sandbox Code Playgroud)

当我在SSMS中运行上述查询时,它会快速返回(必须首先重建我的索引).

但是,生成的SQL是不同的.它包含一个嵌套查询,如下所示:

SELECT TOP (50) 
[Project1].[Id] …
Run Code Online (Sandbox Code Playgroud)

c# linq sql-server entity-framework

8
推荐指数
1
解决办法
820
查看次数

实体框架6生成的非常低效的查询

这是我想要的查询:

select top 10 *
from vw_BoosterTargetLog
where OrganizationId = 4125
order by Id desc
Run Code Online (Sandbox Code Playgroud)

它执行亚秒.

这是我的实体框架(6.1.2)在C#中的等价物:

return await db.vw_BoosterTargetLog
    .Where(x => x.OrganizationId == organizationId)
    .OrderByDescending(x => x.Id)
    .Take(numberToRun)
    .ToListNolockAsync();
Run Code Online (Sandbox Code Playgroud)

这是它生成的SQL:

SELECT TOP (10) 
    [Project1].[OrganizationId] AS [OrganizationId], 
    [Project1].[BoosterTriggerId] AS [BoosterTriggerId], 
    [Project1].[IsAutomatic] AS [IsAutomatic], 
    [Project1].[C1] AS [C1], 
    [Project1].[CustomerUserId] AS [CustomerUserId], 
    [Project1].[SourceUrl] AS [SourceUrl], 
    [Project1].[TargetUrl] AS [TargetUrl], 
    [Project1].[ShowedOn] AS [ShowedOn], 
    [Project1].[ClickedOn] AS [ClickedOn], 
    [Project1].[BoosterTargetId] AS [BoosterTargetId], 
    [Project1].[TriggerEventGroup] AS [TriggerEventGroup], 
    [Project1].[TriggerIgnoreIdentifiedUsers] AS [TriggerIgnoreIdentifiedUsers], 
    [Project1].[TargetTitle] AS [TargetTitle], 
    [Project1].[BoosterTargetVersionId] AS [BoosterTargetVersionId], 
    [Project1].[Version] AS [Version], 
    [Project1].[CookieId] …
Run Code Online (Sandbox Code Playgroud)

c# sql-server entity-framework

4
推荐指数
1
解决办法
923
查看次数