繁体   English   中英

EF 5.0中长时间运行的查询

[英]Long running query in EF 5.0

以下查询应返回大约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运行较大查询的能力?

在我看来,您可以通过在此处实际执行一些Join来加快此速度。 尝试这个:

    var query = (from i in context.QbTxnItems.AsNoTracking()
                join p in context.Payments on i.QbTxnId equals p.QbTxnId
                join qi in context.QbTxnIgnores on i.QbTxnId equals qi.QbTxnId
                where (i.ListType == "Invoice")
                select i).OrderBy(i => i.RefNumber);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM