空字段和SQL Is Null问题

本文关键字:Null 问题 Is SQL 字段 | 更新日期: 2023-09-27 18:05:51

在stackoverflow上有大量与我的问题相关的问题,但我无法推断出问题的原因和在这种情况下最有效的解决方案;

所以我有一个方法,允许您传递一个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
               };
}

空字段和SQL Is Null问题

是的,如果它是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, null匹配返回没有结果,并且您必须使用ISNULL将其转义为空白。

要允许为空,您还可以尝试如下

  GSectionID = emp.SectionID ?? Guid.Empty,

在EF6中你可以使用UseCSharpNullComparisonBehavior来解决这个问题。你需要设置上下文选项UseCSharpNullComparisonBehavior为true它的行为会像c#一样。

objectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;

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