public List<DateTime> CalorieDates(int patientId)
{
using (var db = new DbConn())
{
List<DateTime> query =
db.Calories.Where(d => d.PatientId == patientId && d.FoodId != "initial" && d.DateOfEntry != null)
.Select(d => System.Data.Entity.DbFunctions.TruncateTime(d.DateOfEntry)).Distinct().ToList();
return query;
}
}
为什么这会将我的列表转换为可以为空的日期时间?
Error CS0029 Cannot implicitly convert type
'System.Collections.Generic.List<System.DateTime?>'
to 'System.Collections.Generic.List<System.DateTime>'
如何防止这种情况?我不想要一个可以为空的日期时间列表。
答案 0 :(得分:6)
由于某些未知原因(可能使查询提供程序的生活更轻松),DbFunctions
类不为TruncateTime
和DateTime
提供单独的DateTime?
重载,但是单个方法使用DateTime?
参数来处理这两种情况。但是,作为副作用,它将表达式更改为DateTime?
,即使参数为DateTime
(因为它似乎在您的情况下)。
所以你需要纠正这个问题。一旦您知道自己总是通过DateTime
(因此结果不能是null
),您只需在.Value
来电结束时添加TruncateTime
,问题就出现了解决。
.Select(d => System.Data.Entity.DbFunctions.TruncateTime(d.DateOfEntry).Value)
答案 1 :(得分:0)
.Select(d => System.Data.Entity.DbFunctions.TruncateTime(d.DateOfEntry))
.Distinct().ToList().Cast<List<DateTime>>()
答案 2 :(得分:0)
就像@stuartd在评论中所说,TruncateTime
可能正在返回DateTime?
;您的Select
会返回IEnumerable<DateTime?>
因为您的lambda从TruncateTime
获得的内容,Distinct()
会返回相同内容,而ToList()
会将其转换为{{ 1}}因为,嘿,List<DateTime?>
返回的是什么。
所以你最终得到了IEnumerable<DateTime?>.ToList()
的列表。这很容易。如果你不想要,DateTime?
别的东西。
现在,我将假设Select
返回一个nullabe类型,因为它可能返回null。我的猜测是它的参数是TruncateTime
,如果你传入一个null,它只返回null。由于您在结构中传递,它可能无法在您的特定用法中返回null,但我不知道所以我会安全地玩它。
因此,您希望将可空日期的枚举转换为常规日期,而不会将任何空的nullable转换为常规DateTime?
。因此,首先过滤掉那些不为空的,然后选择它们的值。
DateTime
答案 3 :(得分:-1)
看起来您调用的db方法只是截断日期时间removes the time portion
如果是这种情况,请改用以下内容。
List<DateTime> query = db.Calories.Where(d => d.PatientId == patientId && d.FoodId != "initial" && d.DateOfEntry != null)
.Select(d => d.DateOfEntry.Date).Distinct().ToList();