2015-04-01 57 views
2

當我嘗試運行下面的實體框架查詢:爲什麼匿名類型實例無法接受實體框架查詢返回的空值?

var l = (from s in db.Samples 
      let action = db.Actions.Where(x => s.SampleID == x.SampleID && x.ActionTypeID == 1).FirstOrDefault() 
      where s.SampleID == sampleID 
      select new 
      { 
      SampleID = s.SampleID, 
      SampleDate = action.ActionDate, 
      }).ToList(); 

我得到以下異常:

演員陣容價值型「日期時間」失敗,因爲物化 值爲null。 結果類型的通用參數或查詢 必須使用可爲空的類型。

的問題可能是,Action.ActionDate定義爲EF模型非可空DateTime,但查詢返回null時有分配給Sample沒有相關的動作。

解決方法是返回一個具有可空屬性的非匿名類型,但爲什麼匿名類型不能接受空結果?匿名類型可以以某種方式強制使用可爲空的屬性創建嗎?

+2

沒有通用類型。這裏有匿名類型。匿名類型在編譯時「定義」 – xanatos 2015-04-01 19:24:41

+2

你可以嘗試'SampleDate =(DateTime?)action.ActionDate' – Grundy 2015-04-01 19:28:46

+2

Action.ActionDate被定義爲EF模型**中不可爲空的DateTime,**是你的問題。如果數據庫列可以爲空,那麼它在模型中不應該是不可空的。 – Servy 2015-04-01 19:31:27

回答

4

您正在使用匿名類型,而不是泛型類型。匿名類型由編譯器在編譯時定義。最後,它就像你根據你的=new正確使用類型創建一個

class MyEntity 
{ 
    public readonly int SampleID; 
    public readonly DateTime SampleDate; 
} 

的類型「中選擇」由編譯器。所以如果SampleID是intActionDateDateTime那麼這些類型將被使用。

現在,什麼情況是,當實體框架執行查詢和「反序列化」中的「MyEntity」類的數據,它會嘗試給它的SQL收到null轉換爲DateTime,並轉換失敗。該解決方案是定義ActionDate作爲匿名類型DateTime?

SampleDate = (DateTime?)action.ActionDate, 

或給SampleDate數值時ActionDatenull

SampleDate = (DateTime?)action.ActionDate ?? default(DateTime), 

(這第二種解決方案是未經測試,因爲我不t有一個SQL Server在我附近,如果它工作SampleDate將是DateTime,將包含查詢返回的日期或DateTime.MinValue當日期爲null

+0

是的,小菜一碟...有時候比想一想要容易些。謝謝 – 2015-04-01 19:41:45

相關問題