使用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)
答案 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将反映尽可能多。