IQueryable 丢失了 ORDER BY
IQueryable losing the ORDER BY
谁能解释为什么会这样?
Dim lReturn As IQueryable(Of Inventory) = context.Inventories.OrderBy(Function(o) o.SortOrder)
'' --- In the sql profiler, I can see Order by is added
'' Dim lst = lReturn.ToList
If Not loggedInUser.IsAdmin Then
lReturn = lReturn.Where(Function(x) x.AdminOnly = False)
'' --- In the sql profiler, I can see Order by is added
'' Dim lst = lReturn.ToList
lReturn = From f In lReturn
Group Join a In context.AssignServices On f.ID Equals a.Id Into fas = Group
From a In fas.Where(Function(x) x.AgentId = loggedInUser.CompanyId).DefaultIfEmpty()
Where a.Assign = True OrElse f.isVisibleToAllAgents = True
Select f
'' --- In the sql profiler, I can see **Order by is not included**
Dim lst = lReturn.ToList ''*Problem is here*
End If
lReturn
的开头已经包含了 Order By
,这是一个 Lambda 表达式。如果用户不是管理员,最后的 Linq 查询由于某种原因不包括排序依据。
我正在使用 sql 探查器来了解查询的外观,如下所示
exec sp_executesql N'SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
.........
[Extent1].[SortOrder] AS [SortOrder]
FROM [dbo].[Inventories] AS [Extent1]
LEFT OUTER JOIN [dbo].[AssignService] AS [Extent2] ON ([Extent1].[ID] = [Extent2].[Id]) AND ([Extent2].[AgentId] = @p__linq__0)
WHERE (0 = [Extent1].[AdminOnly]) AND ([Extent2].[Assign] = 1 OR [Extent1].[isVisibleToAllAgents] = 1) ,N'@p__linq__0 int',@p__linq__0=112
这是正常行为吗?还是我错过了什么?
基于 LINQ 的 ORM 已经放宽了关于支持哪些特定模式排序的规则。始终支持的(根据我的经验)是在查询末尾进行排序,后面只有 Where 和 Select 操作。
可能顺序在加入时丢失了。不让我吃惊。
谁能解释为什么会这样?
Dim lReturn As IQueryable(Of Inventory) = context.Inventories.OrderBy(Function(o) o.SortOrder)
'' --- In the sql profiler, I can see Order by is added
'' Dim lst = lReturn.ToList
If Not loggedInUser.IsAdmin Then
lReturn = lReturn.Where(Function(x) x.AdminOnly = False)
'' --- In the sql profiler, I can see Order by is added
'' Dim lst = lReturn.ToList
lReturn = From f In lReturn
Group Join a In context.AssignServices On f.ID Equals a.Id Into fas = Group
From a In fas.Where(Function(x) x.AgentId = loggedInUser.CompanyId).DefaultIfEmpty()
Where a.Assign = True OrElse f.isVisibleToAllAgents = True
Select f
'' --- In the sql profiler, I can see **Order by is not included**
Dim lst = lReturn.ToList ''*Problem is here*
End If
lReturn
的开头已经包含了 Order By
,这是一个 Lambda 表达式。如果用户不是管理员,最后的 Linq 查询由于某种原因不包括排序依据。
我正在使用 sql 探查器来了解查询的外观,如下所示
exec sp_executesql N'SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
.........
[Extent1].[SortOrder] AS [SortOrder]
FROM [dbo].[Inventories] AS [Extent1]
LEFT OUTER JOIN [dbo].[AssignService] AS [Extent2] ON ([Extent1].[ID] = [Extent2].[Id]) AND ([Extent2].[AgentId] = @p__linq__0)
WHERE (0 = [Extent1].[AdminOnly]) AND ([Extent2].[Assign] = 1 OR [Extent1].[isVisibleToAllAgents] = 1) ,N'@p__linq__0 int',@p__linq__0=112
这是正常行为吗?还是我错过了什么?
基于 LINQ 的 ORM 已经放宽了关于支持哪些特定模式排序的规则。始终支持的(根据我的经验)是在查询末尾进行排序,后面只有 Where 和 Select 操作。
可能顺序在加入时丢失了。不让我吃惊。