LINQ:where子句中的可空值类型

时间:2013-12-31 15:03:21

标签: c# linq linq-to-entities nullable

我正在尝试使用可能的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一起使用?

2 个答案:

答案 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;