C# 尝试比较日期时LINQ引发异常
我有以下资料:C# 尝试比较日期时LINQ引发异常,c#,linq,datetime,C#,Linq,Datetime,我有以下资料: return db.Events .Where(e => e.BedId == bed && e.Date.Year == date.Year && e.Date.Month == date.Month && e.Date.Day == date.Day)
return db.Events
.Where(e =>
e.BedId == bed
&& e.Date.Year == date.Year
&& e.Date.Month == date.Month
&& e.Date.Day == date.Day)
.Select(x => new EventViewModel() {
Id = x.Id,
Date = x.Date.Date.ToString(),
StartTime = x.StartTime.ToString(),
EndTime = x.EndTime.ToString(),
Planned = x.Planned,
EngineSN = x.EngineSN,
Details = x.Details,
Bed = x.Bed.Name,
Category = x.Subcategory.Category.Name,
Subcategory = x.Subcategory.Name,
Project = x.Project.Name,
Type = x.Type.ToString()
})
.ToList();
它抱怨LINQ不支持成员“date”
我知道LINQ不能处理日期,因为它不知道如何读取和比较日期。这就是为什么我特别要求它比较年、月、日属性都是整数。在我的查询中,是什么引发了此异常
p.S.EventViewModel.Date是一个字符串您需要更改查询,这样您就不会在DateTime上调用Date属性并更改视图模型 将定义为字符串的DateTime属性定义为DateTime。 像这样注释DateTime属性
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? Date{ get; set; }
var startDate = date.Date;
var endDate = date.Date.AddDays(1);
return db.Events
.Where(e =>
e.BedId == bed
&& e.Date >= startDate
&& e.Date < endDate)
.Select(x => new EventViewModel()
{
Id = x.Id,
Date = x.Date,
StartTime = x.StartTime,
EndTime = x.EndTime,
Planned = x.Planned,
EngineSN = x.EngineSN,
Details = x.Details,
Bed = x.Bed.Name,
Category = x.Subcategory.Category.Name,
Subcategory = x.Subcategory.Name,
Project = x.Project.Name,
Type = x.Type.ToString()
})
.ToList();
或者您在UI中使用的任何日期格式
像这样更改您的查询
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? Date{ get; set; }
var startDate = date.Date;
var endDate = date.Date.AddDays(1);
return db.Events
.Where(e =>
e.BedId == bed
&& e.Date >= startDate
&& e.Date < endDate)
.Select(x => new EventViewModel()
{
Id = x.Id,
Date = x.Date,
StartTime = x.StartTime,
EndTime = x.EndTime,
Planned = x.Planned,
EngineSN = x.EngineSN,
Details = x.Details,
Bed = x.Bed.Name,
Category = x.Subcategory.Category.Name,
Subcategory = x.Subcategory.Name,
Project = x.Project.Name,
Type = x.Type.ToString()
})
.ToList();
看起来您要做的是在比较和预测中排除日期的时间部分。如果是这种情况,请使用DbFunctions
.Where(DbFunctions.TruncateTime(e.Date == date))
然后
Date = DbFunctions.TruncateTime(x.Date)
LINQ使用其他人提到的日期。正是您的SELECT在x.Date.Date.ToString中抱怨这是LINQ To Entities,这意味着您的查询最终必须转换为SQL。检查以下问题的答案:LINQ不能处理日期是什么意思?林克绝对可以。LINQ可以处理任何类型,这就是语言集成查询的全部要点。您使用的是像LINQ to SQL或LINQ to Entities这样的特定框架吗?@pymaxion抱歉,我的意思是在处理实体和SQL时。我相信,where子句中的日期不是问题,问题在您的SELECT中。可能在x.Date.Date.ToString。尝试相同的语句,但不包括SELECT part。@沙什布山您是正确的,注释出x.Date.Date.ToString有效。可能是什么问题?ToString中的方法在SQL中不可用,因此在解析过程中找不到等效的SQL部分。这是我的理解。