Vb.net Linq-to-Entity框架中的多动态Order-By
SortExpression的输入类似于“field1 true;field2 false;field3 true” 我希望查询具有多个order by字段,实际情况是只应用最后一个order by。我做错了什么Vb.net Linq-to-Entity框架中的多动态Order-By,vb.net,linq-to-entities,entity-framework-5,Vb.net,Linq To Entities,Entity Framework 5,SortExpression的输入类似于“field1 true;field2 false;field3 true” 我希望查询具有多个order by字段,实际情况是只应用最后一个order by。我做错了什么 工作结果如下所示: Dim receipts As IQueryable(Of ReceiptEntity) = db.Receipts 'code to filter removed for brevity Dim sorts() As String = SortExpress
工作结果如下所示:
Dim receipts As IQueryable(Of ReceiptEntity) = db.Receipts
'code to filter removed for brevity
Dim sorts() As String = SortExpression.Split(";")
For Each sort As String In sorts
Dim sortParts() As String = sort.Split(" ")
If sortParts(1).ToLower = "true" Then
receipts = receipts.OrderBy(Of ReceiptEntity)(sortParts(0).ToString(), SortDirection.Ascending)
Else
receipts = receipts.OrderBy(Of ReceiptEntity)(sortParts(0).ToString(), SortDirection.Descending)
End If
Next
对于第二次和所有后续排序操作,您必须使用
ThenBy
而不是OrderBy
。谢谢,您还必须在声明中使用IOrderedQueryable(of T)而不是IQueryable(of T),以获得ThenBy和ThenBy降序。
Dim receipts As IOrderedQueryable(Of ReceiptEntity) = db.Receipts.Include(Function(r) r.LineItems).Include(Function(r) r.Payments)
Dim sorts() As String = SortExpression.Split(";")
Dim sortParts() As String
sortParts = sorts(0).Split(" ")
If sortParts(1).ToLower = "true" Then
receipts = receipts.OrderBy(sortParts(0).ToString())
Else
receipts = receipts.OrderByDescending(sortParts(0).ToString())
End If
For Each sort As String In sorts.Skip(1)
sortParts = sort.Split(" ")
If sortParts(1).ToLower = "true" Then
receipts = receipts.ThenBy(sortParts(0).ToString())
Else
receipts = receipts.ThenByDescending(sortParts(0).ToString())
End If
Next