2013-11-24 57 views
0

我大力搜索對此的答案,但我無法找到(或理解)解決方案。我有一個查詢,我正在加入另一個可能有或沒有關聯記錄的表。下面是該查詢:實體框架 - 處理沒有來自連接表的記錄的連接

var educationUniversity = result.new_educationUniversity.Select(c => new 
    { c.majorDegree, c.dateEnd, c.dateStart, c.institutionName, 
     c.degreeProgramCompletionStatus, c.institutionAddress, 
     attachmentId = c.attachmentId ?? 0, 
     fileName = c.new_attachments.fileName ?? "No Attachment"}).ToList(); 

第一個表是「new_educationUniversity」,它擁有用戶的學院或大學學位的細節。用戶可能已上傳附件(存儲在「new_attachments」表中)。 attchmentID是「new_attachments」表中的主鍵和「new_educationUniversity」表中的外鍵。 EF看到了這種關係。

我將結果綁定到中繼器,但如果沒有相關的附件,代碼將失敗。一切工作正常,如果有附件或如果我刪除對fileName的引用。

上面,我正在處理,如果fileName爲NULL(或至少我試圖),但我懷疑我的問題是該記錄根本不存在,這是不同於NULL我猜。我試過使用類似:c.new_attachments.fileName.SingleOrDefault()或DefaultIfEmpty()沒有運氣。

作爲比喻,假設您有一個CUSTOMERS表和一個ORDERS表。你想查詢以下:

- 客戶姓氏 - 客戶第一名稱 - 客戶最近的訂單ID

從來沒有誰買什麼東西。然而,您已註冊的客戶。我確信我正在做一些完全不討好的事情,所以任何協助都非常感謝。謝謝!

+1

你要求的是一個「左連接」,有很多例子可以說明如何做到這一點。 http://stackoverflow.com/questions/3404975/left-outer-join-in-linq或http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx –

+0

找到一種技術,通過工作這個鏈接雖然我不完全理解。謝謝! – Matt

回答

0

所以,你有幾件事會在這裏:

  • 你可以在你的參考c.new_attachments.fileName一個空引用異常。如果new_attachments爲null,那麼這將引發異常。包括空合併運算符(??)將無濟於事,因爲您試圖訪問可能爲空的某個屬性。
  • 除非你懶惰加載(通常是壞的),否則你沒有理由試圖創建一個動態類型的對象發送到你的中繼器。只需直接傳遞result.new_educationUniversity對象即可。

什麼是解決方案? 我會創建一個部分類,爲new_educationUniversity類添加一個新屬性。添加一個null-reference-safe屬性引用來確定new_educationUniversity的new_attachments屬性的文件名。然後,將轉發器綁定到您的新媒體資源。例如:

public partial class new_educationUniversity { 
    public String AttachmentFileName { 
     get { 
      if (new_attachments == null) 
       return ""; 
      else 
       return new_attachments.fileName; 
     } 
    } 
} 
+0

我不相信我正在使用延遲加載。當通過名稱遍歷表層次結構時,我忘記了在EF中調用它。如果EF知道我的CUSTOMERS表,並且我的ORDERS表已加入CUSTOMER_ID列,那麼在我收到訂單後,請在訂單 var order = orders.Where(c => c.id == 3).Single(); 我仍然可以獲得客戶的名字,order.customer.firstName 這樣做不好嗎?我的SQL技能和我的需求是非常基本的。謝謝! – Matt

+0

如果您正在檢索order.customer(獲取order.customer.firstName),那麼它會延遲加載。在運行查詢來檢索您的訂單之後。如果您在初始查詢中使用.Include(),並且急於加載關聯的客戶對象,那麼您正在加載。假設你在某個時候確實需要這些客戶,那麼急切的加載會更好。 –

0

以下代碼行似乎正在工作。

var educationUniversity = result.new_educationUniversity.Select 
(c => new { c.majorDegree, c.dateEnd, c.dateStart, c.institutionName, 
c.degreeProgramCompletionStatus, c.institutionAddress, attachmentId = c.attachmentId ?? 0, 
fileName = (c.new_attachments == null ? "***NO ATTACHMENT***" : c.new_attachments.fileName)}).ToList(); 

我不完全瞭解這行的意思:

fileName = (c.new_attachments == null ? "***NO ATTACHMENT***" : c.new_attachments.fileName)} 

我認爲它說:「如果無所不有與字符串替換‘沒有附件’,否則用的是在DB」

這是可以接受的嗎?到現在爲止還挺好。謝謝!