可空字段和SQL是空问题

时间:2013-03-25 15:57:03

标签: c# linq entity-framework nullable isnull

有关我的问题的堆栈流量上有大量问答,但我无法推断出问题的原因以及在这种情况下效果最佳的解决方案;

所以我有一个允许你传递parentID的方法,并且基于值记录将使用LINQ查询进行过滤。数据库中的字段允许NULL值。现在,如果我在where子句中使用==运算符比较字段,则发出的sql是错误的(它不使用IS NULL进行比较),因此查询产生0结果。我使用Object.Equals()方法解决了这个问题。这有用,但现在我在传递NON 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 个答案:

答案 0 :(得分:3)

是的,如果它是SQL,你的问题也会发生。你必须明确地处理null,这应该工作:

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

这假定您想要匹配null。如果您希望null返回未过滤的所有结果,请执行以下操作:

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

我甚至有时会遇到这个问题,并且发现LINQ会一直正确翻译的方式:

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

这是因为即使在SQL中,如果你在ParentID = @ParentID所做的地方,空匹配也不会返回任何结果,你必须使用ISNULL将其转义为空白。

答案 1 :(得分:1)

允许可空可以尝试像这样

  GSectionID = emp.SectionID ?? Guid.Empty,

答案 2 :(得分:1)

在EF6中,您可以使用UseCSharpNullComparisonBehavior来解决此问题。您需要将上下文选项UseCSharpNullComparisonBehavior设置为true,它将表现得像C#。

objectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;

您可以在以下链接中查看更多内容:http://entityframework.codeplex.com/workitem/145