有关我的问题的堆栈流量上有大量问答,但我无法推断出问题的原因以及在这种情况下效果最佳的解决方案;
所以我有一个允许你传递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
};
}
答案 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