2012-02-27 37 views
11

我正在使用LINQ to SQL來處理數據庫查詢我正在處理的應用程序。自動檢查與LINQ查詢的NULL關係

對於這個例子的目的,假設我有一些表像這樣

- Company 
- Product 
- Item 
- Order 

,並讓說Company有0個或更多Products,一個Product有0個或更多ItemsItem有0或更多Orders

現在,讓我們,所以我已經獲得的Orders一個列表,像:

IQueryable<Order> myOrders = GetMyOrders(); 

現在可以說,我想查詢訂單特定Company.Name,但有一種情況,每個表父ID可以NULL(我知道這似乎不合乎邏輯與我的示例數據,但它只是一個例子)

使得假設沒有NULL父的ID我可以這樣做:

var filteredOrders = myOrders.Where(x => x.Item.Product.Company.Name == "Company1"); 

但是,這將工作正常,因爲可能有NULL家長ID值,我需要檢查每個父對象,以確保它不是null之前查詢下一個父(否則我會得到一個異常)。所以,我做這樣的事情:

var filteredOrders = myOrders.Where(x => 
    x.Item != null && 
    x.Item.Product != null && 
    x.Item.Product.Company != null && 
    x.Item.Product.Company.Name == "Company1"); 

所以我的問題:有沒有更好的辦法(在可讀性和易於編碼方面)來做到這一點不必包括所有空的檢查?沿途發現的任何空父母都應該導致排除在結果列表之外。

請防止空父母沒有意見,該數據庫將不會改變(並且是完全有效的反正)

+0

更好的性能更好?我不這麼認爲。無論如何,我想不出你可以擺脫所有那些空檢查。更漂亮的代碼?我會和Lonli-Lokli的建議一起去。 – InBetween 2012-02-27 12:20:37

+0

@InBetween:對不起,當我說得更好時,我的意思更多是爲了可讀性。但請記住我對Lonli-Lokli的帖子的評論,在那裏我提到期望最終讓它作爲SQL查詢運行,而不是首先返回所有結果 – musefan 2012-02-27 12:26:30

+0

聽起來像內部聯接的完美應用程序,它將使用空引用展示所有元素。加入所有表格並按公司名稱過濾結果。 (但這不會更具可讀性) – Stephan 2012-02-27 12:56:15

回答

3

已知有pattren(見空對象模式)。你也可以閱讀this article

+1

我已經讀過那篇文章,它確實很有趣。但是,由於我的用法,我想知道這是否適合我。假設你的建議是創建一個擴展方法,我擔心這會對我造成重大的性能影響,因爲我正在使用IQueryable,並且不希望對所有結果執行查詢。我當然認爲我必須這樣做(例如,用名單來代替) - 也許在這種情況下,我不得不做很長的路要走......任何想法? – musefan 2012-02-27 11:48:50

+0

然後,你應該編寫自己的linq-to-sql提供程序的實現,並將這些擴展方法合併到上面建議的sql查詢中。或者你可以從頭開始寫這些查詢。 – 2012-02-27 19:02:48