可空字段和SQL是空问题

Kun*_*pal 6 c# linq entity-framework nullable isnull

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
               };
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ins 3

是的,如果是 SQL,也会出现你的问题。您必须显式处理 null,这应该有效:

Where (parentID == null && c.ParentID == null) || (parentID == c.ParentID)
Run Code Online (Sandbox Code Playgroud)

这假设您想要一个空值来匹配。如果您希望 null 返回所有未过滤的结果,请改为:

Where (parentID == null) || (parentID == c.ParentID)
Run Code Online (Sandbox Code Playgroud)

有时我也遇到了麻烦,并且发现 LINQ 始终正确翻译的方法是:

Where (parentID == null) || (parentID != null && parentID == c.ParentID)
Run Code Online (Sandbox Code Playgroud)

这是因为即使在 SQL 中,如果执行 where ParentID = @ParentID,空匹配也不会返回结果,并且必须使用ISNULL将其转义为空白。