Order by不能与LINQ中的Concat()一起使用

pmm*_*pmm 16 .net linq vb.net sql-order-by

使用VB.net和以下LINQ语句.我怀疑"Order by"不起作用Concat().我想列出用户拥有的当前项目,然后按顺序列出更多可用项目.所以首先我从数据库中选择当前项目,然后按顺序选择下一个可用项目.LINQ忽略了order by语句并按PK排序(这是itemID)我在执行语句后立即检查了列表.当我分解声明并单独执行它们时,它们按预期工作.任何想法,建议或评论.谢谢,PM

(From items In myDatabase.ItemAssignments _
 Where items.BuildingID = buildingID _
 And items.ResidentID = ResidentID _
 Select items).Concat(From moreitems In myDatabase.ItemAssignments _
                      Where moreitems.occupied = 0 _
                      And moreitems.BuildingID = buildingID _
                      Order by moreitems.Floor, moreitems.ItemNumber _
                      Select moreitems)
Run Code Online (Sandbox Code Playgroud)

Ahm*_*eed 15

ConcatLINQ to SQL方面确实忽略了order by子句.如果您正在使用LINQPad或设置DataContext.Log属性,则可以从生成的SQL中验证这一点.

解决此问题的一种方法是通过匿名类型引入虚拟值以帮助排序.为了清楚起见,我已经拆分了下面的查询,尽管使用您开始的查询语法可以使用相同的方法,直到您需要指定顺序.

Dim firstQuery = From items In myDatabase.ItemAssignments _
                 Where items.BuildingID = buildingID _
                 And items.ResidentID = ResidentID _
                 Select New With { .Row = items, .Order = 1 }
Dim secondQuery = From moreitems In myDatabase.ItemAssignments _
                  Where moreitems.occupied = 0 _
                  And moreitems.BuildingID = buildingID _
                  Select New With { .Row = moreitems, .Order = 2 }

Dim query = firstQuery.Concat(secondQuery) _
                      .OrderBy(Function(o) o.Order) _
                      .ThenBy(Function(o) o.Row.Floor) _
                      .ThenBy(Function(o) o.Row.ItemNumber) _
                      .Select(Function(o) o.Row)
Run Code Online (Sandbox Code Playgroud)

另一个不太理想的选择是在其中一个查询上调用该AsEnumerable方法,这将从数据库中提取结果.根据所涉及的项目数量以及是否需要进一步过滤,这可能会对性能产生不利影响.

要使用此方法,此方法会更改原始查询的第一部分以使用:

From items In myDatabase.ItemAssignments.AsEnumerable() ...
Run Code Online (Sandbox Code Playgroud)

然后,第二部分的排序将按预期工作,生成的SQL将反映同样多.