6

与我的问题相关的 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
               };
}
4

3 回答 3

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 中,如果您执行 where ParentID = @ParentID,空匹配不会返回任何结果,您必须使用ISNULL将其转义为空白。

于 2013-03-25T16:05:33.283 回答
1

允许为空你也可以尝试这样

  GSectionID = emp.SectionID ?? Guid.Empty,
于 2014-04-30T11:35:22.500 回答
1

在 EF6 中,您可以使用 UseCSharpNullComparisonBehavior 来解决此问题。您需要将上下文选项 UseCSharpNullComparisonBehavior 设置为 true,它的行为类似于 C#。

objectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;

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

于 2014-05-05T18:38:30.467 回答