使用 VB.net 和以下 LINQ 语句。我怀疑“排序依据”不适用于Concat()
。我想列出用户当前拥有的项目,然后按升序列出更多可用项目。因此,首先我从数据库中选择当前项目,然后按顺序选择下一个可用项目。 LINQ 忽略 order by 语句并按 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)
The Concat
当涉及到 LINQ to SQL 时,确实会忽略 order by 子句。如果您使用的是,可以从生成的 SQL 中验证这一点LINQPad http://linqpad.net/或设置DataContext.Log财产 http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.log.aspx.
解决这个问题的一种方法是通过匿名类型引入虚拟值来帮助排序。为了清楚起见,我将下面的查询分开,尽管使用您开始使用的查询语法可以使用相同的方法,直到您需要指定顺序为止。
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 http://msdn.microsoft.com/en-us/library/bb335435.aspx在其中一个查询上,这将从数据库中提取结果。根据涉及的项目数量以及是否需要进一步过滤,这可能会对性能产生不利影响。
要使用此方法,请更改原始查询的第一部分以使用:
From items In myDatabase.ItemAssignments.AsEnumerable() ...
然后,第二部分的排序将按预期工作,生成的 SQL 将反映同样的情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)