【问题标题】:IQueryable losing the ORDER BYIQueryable 丢失 ORDER BY
【发布时间】:2015-07-20 15:18:05
【问题描述】:

谁能解释为什么会这样?

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 查询由于某种原因不包括 order by。 我正在使用 sql profiler 来找出查询的外观,如下所示

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

这是一种常规行为吗?还是我错过了什么?

【问题讨论】:

    标签: vb.net linq lambda sql-server-profiler


    【解决方案1】:

    基于 LINQ 的 ORM 对支持哪些特定的 order by 模式已经放宽了规则。始终支持的(根据我的经验)是在查询结束时排序,后面只有 Where 和 Select 操作。

    可能 order by 在连接处丢失。我一点都不惊讶。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多