2013-03-25 35 views
6

有很多Q &關於與我的問題相關的stackoverflow,但我不能推論出問題的推理和在這種情況下效果最好的解決方案;可空字段和SQL是空的問題

所以我有一個方法,允許您傳遞一個parentID,並根據價值記錄將被過濾使用LINQ查詢。數據庫中的字段允許NULL值。現在,如果我在where子句中使用==運算符比較字段,則發出的sql是錯誤的(它不會使用IS NULL進行比較),因此查詢會返回0結果。我用Object.Equals()方法解決了這個問題。這工作,但現在我得到一個例外傳遞一個非NULL值,一個整數

無法創建一個類型'System.Object'的常量值。只有原始類型或枚舉類型在此上下文中受支持。

所以我寫了一個簡單的方法

using (TestEntities context = new Entities()) 
{ 
    return from c in context.ItemMappings 
      where c.ParentID.Equals(parentID) 
      select new ItemDTO 
      { 
       ItemID = c.Item.ItemID, 
       ItemName = c.Item.ItemName, 
       ItemType = new ItemTypeDTO 
       { 
        TypeID = c.Item.Type.TypeID, 
        TypeName =c.Item.Type.TypeName 
       }; 
} 

回答

3

是也,如果它是SQL出現你的問題。你必須明確地處理null,並且這應該工作:

Where (parentID == null && c.ParentID == null) || (parentID == c.ParentID) 

這假定你想要一個空匹配。如果你想爲null返回所有的結果未經過濾的,而不是做:

Where (parentID == null) || (parentID == c.ParentID) 

我已經受夠了這種麻煩,有時甚至,發現LINQ的方式將正確翻譯所有的時間做的事:

Where (parentID == null) || (parentID != null && parentID == c.ParentID) 

這是因爲即使在SQL中,如果您在ParentID = @ParentID處執行空匹配,則返回空結果,您必須使用ISNULL將其轉義爲空。

+0

我會嘗試在一段時間,我知道通過看它,它會奏效。 順便說一句,我理解我會在SQL中得到同樣的問題的原因,但認爲LINQ引擎會根據我的價值發出正確的SQL。我對使用Object.Equals – 2013-03-25 16:11:43

+0

時得到的異常有更多的困惑,我不確定該錯誤的特殊性;對我來說這是一個新的......不幸的是,EF並不希望在SQL查詢中進行這些優化。 – 2013-03-25 16:17:11

1

要允許爲空的,您也可以嘗試像這樣

GSectionID = emp.SectionID ?? Guid.Empty, 
1

在EF6你可以使用UseCSharpNullComparisonBehavior來解決這個問題。您需要將上下文選項UseCSharpNullComparisonBehavior設置爲true,它的行爲將與C#類似。

objectContext.ContextOptions.UseCSharpNullComparisonBehavior = true; 

你可以看到更多的在下面的鏈接:http://entityframework.codeplex.com/workitem/145