截断时间转换列表为可空

时间:2016-04-21 17:53:28

标签: c# asp.net linq

 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>'   

如何防止这种情况?我不想要一个可以为空的日期时间列表。

4 个答案:

答案 0 :(得分:6)

由于某些未知原因(可能使查询提供程序的生活更轻松),DbFunctions类不为TruncateTimeDateTime提供单独的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();