空字段和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,您的问题也会发生。您必须显式地处理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