在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 --
答案 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();