使用VB.net和以下LINQ语句.我怀疑“Order by”不适用于Concat().我想列出用户拥有的当前项目,然后按顺序列出更多可用项目.首先我从数据库中选择当前项目,然后按顺序选择下一个可用项目. LINQ忽略通过语句的顺序和通过PK排序(这是itemID)我在执行语句之后立即检查了列表.当我分解声明并分开处理时,他们按预测工作.任何想法,建议或意见.
谢谢,
下午
谢谢,
下午
(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)
解决方法
当涉及到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() ...