我正在尝试使用可能的NULL值查询表。根据{{3}},使用object.Equals
是这样做的方法:
DateTime? myDate = null;
var q =
from row in db.Activities
where object.Equals(row.FirstActivityTime, myDate)
select row;
这样可行,但是当我为myDate
指定非空值时,
DateTime? myDate = DateTime.Now;
它全部崩溃并抛出异常“无法将类型'System.Nullable`1'强制转换为'System.Object'.LINQ to Entities仅支持转换EDM原语或枚举类型”。
我可以将where子句重写为
where row.FirstActivityTime == myDate || (row.FirstActivityTime == null && myDate == null)
但有没有办法让这项工作与object.Equals
一起使用?
答案 0 :(得分:3)
由于您使用的是LINQ to Entities而不是LINQ to SQL,因此您引用的问题不适用。您可以在过滤器中使用row.FirstActivityTime == myDate
,EF将生成正确的SQL查询,并包含is null
检查以及相等性检查。
修改强>
事实证明这种行为已经改变了一些,你需要在上下文中设置一个标志来恢复旧的行为。 (来源:http://entityframework.codeplex.com/workitem/178)
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
执行此操作后,is null
检查将包含在生成的SQL中。
答案 1 :(得分:-5)
你应该这样写:
var q = from row in db.Activities
where (mydate.HasValue &&
DateTime.Equals(row.FirstActivityTime, myDate.Value))
select row;