2014-01-08 73 views
1

假設我想訂購表q in T,按列q.As.OrderByDescending(p => p.Beginning).FirstOrDefault().B.COrderBy當父值爲空時

但是,q.As.OrderByDescending(p => p.Beginning).FirstOrDefault()a.B可能是null,我該如何實現它?

我當前的代碼:

from q in T 
let a = q.As.OrderByDescending(p => p.Beginning).FirstOrDefault() 
where a != null 
let b = a.B 
where b!= null 
orderby b.C 
select q; 

from q in T 
let a = q.As.OrderByDescending(p => p.Beginning).FirstOrDefault() 
where a != null && a.B != null 
orderby a.B.C 
select q; 

然而,該代碼僅顯示有作爲和B.我怎樣才能做到不過濾任何記錄排序的所有值的記錄?

回答

2

如果這其實是LINQ到對象這應該如果你正在使用LINQ到SQL

from q in T 
orderby q.As.OrderByDescending(p => p.Beginning).FirstOrDefault().B.C 
select q; 

工作,你需要做這個

from q in T 
let x = q.As.OrderByDescending(p => p.Beginning).FirstOrDefault() 
orderby x == null ? null : x.B.C 
select q 
1

您可以使用您已有的解決方案。只需將過濾的數據與過濾的數據的逆相結合即可。

您必須決定在哪裏記錄與空和As和B去。然後你就可以得到過濾後的數據,並與被過濾掉的結果Union它(你可以通過查詢where a == null || a.B == null

如果您希望在零點之前去,做nullList.Union(nonNulls)

您訂購的空這樣於是下令非空的順序

+0

與@Aducci解決方案相比,此解決方案是否會降低性能?我認爲這需要3個操作來完成(2選1和聯合)。 –

+0

是的,會有2個排序操作和一個合併操作。我認爲Aducci的解決方案非常好。我只是對現有代碼的一個補充。我會和他一起去的。 –