Linq具有可空变量:如何执行比较

时间:2015-02-04 13:58:11

标签: c# asp.net .net asp.net-mvc linq

在asp mvc中我有一个从数据库生成的实体框架模型。我有以下生成的实体类:

public partial class person
{
    ...
    public Nullable<System.DateTime> data { get; set; }
    ...
}

现在在我的控制器中我想比较&#34;数据&#34;变量来检查年份是否是当前年份:如何在具有可空日期时间的linq中执行此操作?

我试过了:

 List<person> listOfPeople = (from p in db.person
                              where p.data.Value.Year = currentYear
                              select p).ToList();

但我收到以下错误:

Cannot implicitly convert type 'int' to 'bool'
Property or indexer 'System.DateTime.Year' cannot be assigned to -- 

2 个答案:

答案 0 :(得分:2)

您可以尝试以下内容:

 where p.data.Value.Year == DateTime.Now.Year;

至于你得到的错误:

  

无法隐式转换类型&#39; int&#39;到了布尔&#39;

在你应该有一个可以被评估为真/假的表达式的地方。

这个

List<person> listOfPeople = (from p in db.person
                             where p.data.Value.Year ==  DateTime.Now.Year
                             select p).ToList();

在编译的第一步,它将转换为以下内容:

List<person> listOfPeople = db.person.Where(p=>p.data.Value.Year == DateTime.Now.Year)
                                     .ToList();

Where将谓词作为参数。谓词的签名是:

Func<TSource, bool>

或者这个:

Func<TSource, int, bool>

Where方法已超载。如您所知,返回类型为bool

此表达式p.data.Value.Year = currentYear是一个赋值,无法将其转换为如上所述的谓词。

<强>更新

作为一个更好的设计,我建议你宣布你的课程如下:

public partial class person
{
    ...
    // Use a meaningful name for your properties, variables, methods etc.
    public DateTime? Date { get; set; }
    ...
}

此外,,因为 Date 是可以为空的 DateTime,您必须先检查它是否已有值。

话虽如此,您应该使用以下查询:

List<person> listOfPeople = (from p in db.person
                             where p.Date.HasValue &&
                                   p.Date.Value.Year ==  DateTime.Now.Year
                             select p).ToList();

答案 1 :(得分:2)

您需要使用双==进行值比较。此外,您还需要添加nullcheck(HasValue)以在访问null DateTime的.Year属性时阻止NullReferenceExceptions。

 List<person> listOfPeople = (from p in db.person
                              where p.data.HasValue 
                                && p.data.Value.Year == currentYear
                              select p).ToList();