2015-07-20 70 views
2

任何人都可以解釋爲什麼會發生這種情況嗎?IQueryable失去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在其是Lambda表達式開始已經包含在Order By。如果用戶不是管理員,最後一個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 

它是一個普通的行爲呢?或者我錯過了什麼?

回答

0

基於LINQ的ORM根據支持特定順序的模式有疏鬆的規則。總是支持什麼(根據我的經驗)是在查詢結束時僅使用Where和Select操作進行排序。

可能是順序在連接處丟失。不要驚訝我。