C# LINQtoSQL比LINQtoEntity快3倍
我试图在C# LINQtoSQL比LINQtoEntity快3倍,c#,linq-to-sql,entity-framework-core,linq-to-entities,C#,Linq To Sql,Entity Framework Core,Linq To Entities,我试图在EF Core 3.1.1上执行Linq to Entity查询,它比使用Linq to SQL提供程序在Linqpad上执行相同查询要慢3倍 var startDateTime = new DateTime(2020, 01, 18, 0, 0, 0); var endDateTime = new DateTime(2020, 02, 26, 0, 0, 0); var logs = _db.Logs .Where(w => w.
EF Core 3.1.1
上执行Linq to Entity
查询,它比使用Linq to SQL
提供程序在Linqpad上执行相同查询要慢3倍
var startDateTime = new DateTime(2020, 01, 18, 0, 0, 0);
var endDateTime = new DateTime(2020, 02, 26, 0, 0, 0);
var logs = _db.Logs
.Where(w => w.UserId == 10 && w.DateStamp >= startDateTime && w.DateStamp <= endDateTime)
.GroupBy(g => new
{
g.DateStamp.Date,
g.Result
}).Select(s => new
{
s.Key.Date,
s.Key.Result,
Conversions = s.Count(),
Cost = s.Sum(sum => sum.ConversionCost)
}).ToList();
原因是什么
另外,我曾尝试使用Database.ExecuteSqlInterpolated执行SQL,它提供了与Linq-to-SQL类似的完美性能,但为什么Linq-to-Entity失败了?数据库的大小是否相同?数据库越大,所需的哈希查找就越多[LOG2(N)]尝试不使用列表(),看看它是否有区别。@jdweng数据库是一样的,不使用列表是什么意思?我使用.ToList();若要执行Linq to Entity查询。@jdweng这些都在与同一个数据库对话,请正确阅读问题。这都是关于库之间的差异。@Tomas我们在这里帮不了多少忙。如果您确定速度如此不同,那么您最好在EF Core GitHub repo上打开一个问题。在“快速”查询中缺少参数@p0
。您确定在EF Core中使用相同的LINQ查询,即w.UserId==10
而不是w.UserId==UserId
,其中UserId
是变量吗?因为子查询不应该是SqlServer的问题,但参数嗅探是。
-- Region Parameters
-- @__startDateTime_0='2020-01-01T00:00:00', @__endDateTime_1='2020-02-26T00:00:00'
-- EndRegion
SELECT CONVERT(date, [l].[DateStamp]) AS [Date], [l].[Result], COUNT(*) AS [Conversions], SUM([l].[ConversionCost]) AS [Cost]
FROM [Log] AS [l]
WHERE (([l].[UserId] = 10) AND ([l].[DateStamp] >= @__startDateTime_0)) AND ([l].[DateStamp] <= @__endDateTime_1)
GROUP BY CONVERT(date, [l].[DateStamp]), [l].[Result]
-- Region Parameters
DECLARE @p0 Int = 10
DECLARE @p1 DateTime = '2020-01-01 00:00:00.000'
DECLARE @p2 DateTime = '2020-02-26 00:00:00.000'
-- EndRegion
SELECT COUNT(*) AS [Conversions], SUM([t1].[ConversionCost]) AS [Cost], [t1].[value] AS [Date], [t1].[Result]
FROM (
SELECT CONVERT(DATE, [t0].[DateStamp]) AS [value], [t0].[Result], [t0].[UserId], [t0].[DateStamp], [t0].[ConversionCost]
FROM [Log] AS [t0]
) AS [t1]
WHERE ([t1].[UserId] = @p0) AND ([t1].[DateStamp] >= @p1) AND ([t1].[DateStamp] <= @p2)
GROUP BY [t1].[value], [t1].[Result]
SELECT
CONVERT(DATE, log.DateStamp),
log.Result,
Count(*),
Sum(log.ConversionCost)
FROM
log
Where UserId= 10 AND DateStamp >= '2020-01-01' AND DateStamp <= '2020-02-26'
GROUP BY
log.Result,
CONVERT(DATE, log.DateStamp)
data source=xxx.xxx.xxx.xxx;initial catalog=x-test;user id=x-v2;password=x72-;connection timeout=600