【发布时间】:2013-08-15 17:33:05
【问题描述】:
以下查询应返回大约 7200 条记录:
using (var context = new RapEntities())
{
context.Configuration.ProxyCreationEnabled = false;
var query = from i in context.QbTxnItems.AsNoTracking()
where (i.ListType == "Invoice")
&& !context.Payments.Any(p => p.QbTxnId == i.QbTxnId && p.QbTxnId != null)
&& !context.QbTxnIgnores.Any(ti => ti.QbTxnId == i.QbTxnId)
orderby i.RefNumber
select i;
var items = RapEntities.GetList(query);
生成的sql(来自sql server profiler:
SELECT
[Extent1].[QbTxnItemId] AS [QbTxnItemId],
[Extent1].[ListType] AS [ListType],
[Extent1].[QbTxnId] AS [QbTxnId],
[Extent1].[QbEditSequence] AS [QbEditSequence],
[Extent1].[TxnNumber] AS [TxnNumber],
[Extent1].[RefNumber] AS [RefNumber],
[Extent1].[TxnDate] AS [TxnDate],
[Extent1].[TxnAmt] AS [TxnAmt],
[Extent1].[IsPaid] AS [IsPaid],
[Extent1].[IsCleared] AS [IsCleared],
[Extent1].[LastGetAll] AS [LastGetAll],
[Extent1].[GetIsCleared] AS [GetIsCleared],
[Extent1].[LastModified] AS [LastModified],
[Extent1].[Version] AS [Version],
[Extent1].[RecordStatus] AS [RecordStatus],
[Extent1].[UserId] AS [UserId],
[Extent1].[TableID] AS [TableID]
FROM [dbo].[QbTxnItems] AS [Extent1]
WHERE (N'Invoice' = [Extent1].[ListType]) AND ( NOT EXISTS (SELECT
1 AS [C1]
FROM [dbo].[Payments] AS [Extent2]
WHERE ([Extent2].[QbTxnId] = [Extent1].[QbTxnId]) AND ([Extent2].[QbTxnId] IS NOT NULL)
)) AND ( NOT EXISTS (SELECT
1 AS [C1]
FROM [dbo].[QbTxnIgnores] AS [Extent3]
WHERE [Extent3].[QbTxnId] = [Extent1].[QbTxnId]
))
ORDER BY [Extent1].[RefNumber] ASC
从 Entity Framework 执行时不会在任何合理的时间内完成,而是从 SSMS 立即执行。
使用 take(200) 将行数限制为 200,即使从 EF 调用,查询也会在大约 50 毫秒内运行。将行数增加到 500 会使时间增加到 5 秒以上。
这似乎是不恰当的表现。 EF 必须能够在合理的时间内返回超过几百行。是否可以调整任何设置以增加从 EF 运行更大查询的能力?
【问题讨论】:
-
不确定这是否是问题所在,但我会将您的 p.QbTxnId != null 检查切换为该 Any() 语句中的第一个以缩短比较。这可能会加快一点速度。
-
首先,7200 是很多行,如果可以的话,您可能希望将其缩小一点,或者查看分页数据。其次,是否有任何大型数据类型(巨大的字符串、文件内容等)?
-
SSMS 是快速返回完整的结果集,还是只开始快速将结果流式传输到结果窗格?
-
另外,EF 和 SSMS 中的连接是否相同?我的意思是,ANSI 设置、联合等。EF 代码中是否存在任何 SSMS 中不存在的环境事务?
-
我已经在我的代码中添加了分页,但是在我看来,在 SSMS 中运行基本上不需要时间的东西不应该花很长时间从 ef 运行,我什至等不及了它完成。 SSMS 结果集在不到一秒的时间内完成。
标签: c# entity-framework linq-to-entities