2016-03-03 229 views
0

我有這樣的選擇在VB.Net:VB.Net從數據表中選擇:按字段1排序,如果字段1爲空,則按字段2排序?

Dim thisMonthQuery = 
    From email In DataTablePickers.AsEnumerable() _ 
    Where (email.Field(Of DateTime?)("GenDateScheduled") IsNot Nothing _ 
      AndAlso email.Field(Of DateTime?)("GenDateScheduled") >= New DateTime(curYear, curMonth, 1)) _ 
    Or (email.Field(Of DateTime?)("GenDateCreated") IsNot Nothing _ 
     AndAlso email.Field(Of DateTime?)("GenDateCreated") >= New DateTime(curYear, curMonth, 1)) _ 
    Select email 

我需要按日期對結果。但是,我有兩個日期字段,並且我想要排序的字段可能爲NULL。我想按GenDateScheduled排序,但如果GenDateScheduled爲NULL,我想按GenDateCreated排序。這樣的事情:

Order By (email.Field(Of DateTime)("GenDateScheduled") IsNot Nothing ? email.Field(Of DateTime)("GenDateScheduled") : email.Field(Of DateTime)("GenDateCreated")) 

但該行不起作用,它不是有效的VB.Net代碼。我該如何做到這一點?

回答

1

你所描述的是一個「按順序,然後按」的方法。在LINQ我相信這是與秩序字段的簡單逗號分隔的列表來完成:

Order By email.Field(Of DateTime)("GenDateScheduled"), email.Field(Of DateTime)("GenDateCreated") 

畢竟,考慮什麼「可能是NULL」邏輯上指。 某些記錄可能爲NULL。但是你不排序個人記錄,你排序整個記錄集。所以有些可能在該字段中有NULL值,有些可能不會。因此,如果您按該字段排序,則所有的NULL值將在排序中的相同位置。

要對該位置(以及多個記錄具有相同排序值的任何其他位置)中的記錄進行排序,只需按另一個值排序即可。這是排序中使用的第二列。

+0

是的,它做到了!現在我該如何讓它降序? –

+1

找出來,只需在每個Order By子句後添加Descending –