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

时间:2011-08-08 14:53:44

标签: .net vb.net linq 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)

1 个答案:

答案 0 :(得分:15)

当涉及到LINQ to SQL时,Concat确实忽略了order by子句。如果您正在使用LINQPad或设置DataContext.Log property,则可以从生成的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)

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

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

From items In myDatabase.ItemAssignments.AsEnumerable() ...

第二部分的排序将按预期工作,生成的SQL将反映尽可能多。