动态LINQ OrderBy性能问题,生成嵌套选择

时间:2018-03-19 21:35:23

标签: performance linq dynamic nested sql-order-by

这是一种用于获取表数据的方法。虽然代码“有效”,但它已成为我们应用程序的瓶颈。在某些地区,加载页面可能需要30秒。

var orderBy = String.IsNullOrEmpty(options.SortColumn) ? GetOrderBy<T>() : options.SortColumn;
var orderbyDirection = (options.SortDirection == SortDirection.Desc ? " descending" : "");

options.TotalSize = queryable.Count();

queryable = queryable
    .SearchProperties(options.SearchPhrase)
    .OrderBy(orderBy + orderbyDirection)
    .SetPaging(options);

return queryable;

在调查中我发现当它遇到OrderBy语句时出于某种原因将查询转换为嵌套选择。

它将生成的查询示例

{SELECT 
[Project1].[Id] AS [Id], 
[Project1].[EntryDate] AS [EntryDate], 
[Project1].[Description] AS [Description], 
[Project1].[DiaryTypeString] AS [DiaryTypeString], 
[Project1].[DiaryViewType] AS [DiaryViewType], 
[Project1].[DiaryGroup] AS [DiaryGroup], 
[Project1].[ReminderDate] AS [ReminderDate], 
[Project1].[HasAttachments] AS [HasAttachments], 
[Project1].[OwnerId] AS [OwnerId], 
[Project1].[PropertyId] AS [PropertyId], 
[Project1].[TenancyId] AS [TenancyId], 
[Project1].[SupplierId] AS [SupplierId]
FROM ( SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[EntryDate] AS [EntryDate], 
    [Extent1].[Description] AS [Description], 
    [Extent1].[DiaryTypeString] AS [DiaryTypeString], 
    [Extent1].[DiaryViewType] AS [DiaryViewType], 
    [Extent1].[DiaryGroup] AS [DiaryGroup], 
    [Extent1].[ReminderDate] AS [ReminderDate], 
    [Extent1].[HasAttachments] AS [HasAttachments], 
    [Extent1].[OwnerId] AS [OwnerId], 
    [Extent1].[PropertyId] AS [PropertyId], 
    [Extent1].[TenancyId] AS [TenancyId], 
    [Extent1].[SupplierId] AS [SupplierId]
    FROM [dbo].[vwDiary] AS [Extent1]
    WHERE (([Extent1].[OwnerId] = @p__linq__0) OR (([Extent1].[OwnerId] IS NULL) AND (@p__linq__0 IS NULL))) AND ( NOT ((N'Work Order' = [Extent1].[DiaryTypeString]) AND ([Extent1].[DiaryTypeString] IS NOT NULL))) AND ( NOT ((N'Alert' = [Extent1].[DiaryTypeString]) AND ([Extent1].[DiaryTypeString] IS NOT NULL)))
)  AS [Project1]
ORDER BY [Project1].[EntryDate] DESC}

我有点担心此时该做什么,OrderBy的实施方式有问题吗?有没有其他方法可以通过动态列进行订购?

0 个答案:

没有答案