[英]Linq to sql datetime issue
当我调用GetClosestStartDate时,它会弹出以下消息其他信息:
LINQ to Entities无法识别方法'System.String ToString()',并且该方法无法转换为商店表达式。 我还尝试了从“ TT.Startdate.Value.ToString()”中删除ToString并将“ string CStartdate {get; set;}更改为DateTime CStartdate {get; set;}”的尝试。
class Class_CourseStartdate
{
public string CStartdate { get; set; }
public int TimeTableID { get; set; }
}
public List<Class_CourseStartdate> GetClosestStartDate(DateTime CoeStartdate)
{
return (from TT in _er.TimeTables
where TT.Startdate == CoeStartdate
select new Class_CourseStartdate
{ CStartdate = TT.Startdate.Value.ToString() ,
TimeTableID = TT.TimeTableID
}
).ToList();
}
最简单的方法是仅获取要转换为SQL的部分中所需的数据,然后在本地进行其余操作:
public List<Class_CourseStartdate> GetClosestStartDate(DateTime coeStartdate)
{
return _er.TimeTables
.Where(tt => tt.Startdate == coeStartdate)
.Select(tt => new { tt.Startdate, tt.TimeTableID })
.AsEnumerable() // Do the rest locally
.Select(tt => new Class_CourseStartdate
{
CStartdate = tt.Startdate.Value.ToString() ,
TimeTableID = tt.TimeTableID
}
.ToList();
}
请注意,我在这里已停止使用查询表达式,因为当您需要在其上调用方法时它变得很丑陋-而您正在做的只是一个简单的Where
and Select
。 当查询表达式涉及透明标识符时(例如在联接中),查询表达式最有用。
接下来,我会注意到我们已经在检查tt.Startdate
是否等于传入的日期-那么为什么要麻烦提取它呢?
public List<Class_CourseStartdate> GetClosestStartDate(DateTime coeStartdate)
{
return _er.TimeTables
.Where(tt => tt.Startdate == coeStartdate)
.Select(tt => tt.TimeTableID)
.AsEnumerable() // Do the rest locally
.Select(tid => new Class_CourseStartdate
{
CStartdate = coeStartDate.ToString() ,
TimeTableID = tid
}
.ToList();
}
或可能只是更改方法以返回时间表ID,因为这确实在做。 我也会更改方法名称:
public List<int> GetTimeTableIdsForStartDate(DateTime coeStartdate)
{
return _er.TimeTables
.Where(tt => tt.Startdate == coeStartdate)
.Select(tt => tt.TimeTableID)
.ToList();
}
即使你坚持Class_CourseStartdate
我会改变CStartdate
属性只是DateTime
,而不是string
-避免使用串在你的模型,除非你真的不得不这样做。
此外,您的命名当前感觉到处都是Startdate
到处都应该是StartDate
,应该删除C
和Class_
前缀,等等。
试试这个:
return (from TT in _er.TimeTables
where TT.Startdate == CoeStartdate
select new
{
CStartdate = TT.Startdate.Value.ToString() ,
TimeTableID = TT.TimeTableID
}
).AsEnumerable()
.Select(x=> new Class_CourseStartdate
{
CStartdate = x.CStartdate.Value.ToString(),
TimeTableID = x.TimeTableID
}).ToLIst();
这样,您可以从数据库中获取数据,然后应用所需的格式。
LINQ
名称空间中未定义的大多数函数都不能在IQueryabe
LINQ
表达式内使用( ToString
是其中之一)。 解决方案是仅照原样复制值并随后执行转换,或者将LINQ
替换for
循环以遍历值,在这种情况下,可以正确使用ToString
。
首先,那里可能存在异常: TT.StartDate
可能为null,并且在调用Value
时会获得异常。
其次,为什么CStartDate
是一个字符串? 您将无法执行特定于DateTime
操作,并且如果将字符串转换回DateTime
是在具有不同区域性的线程上进行的,则可能会遇到问题。
作为快速解决方案,您可以在将数据加载到内存中后尝试向查询中添加第二个投影:
return _er.TimeTables
.Where(tt => tt.Startdate == CoeStartdate)
.Select(tt => new { StartDate = tt.StartDate, Id = tt.TimeTableID})
.ToList()
.Select(tt => new Class_CourseStartDate
{
// Avoid the exception by checking if property has value
CStartDate = tt.StartDate.HasValue ? tt.StartDate.Value.ToString() : String.Empty,
TimeTableId = tt.Id
})
.ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.