C# Net MVC Linq to Sql如何处理空日期时间

C# Net MVC Linq to Sql如何处理空日期时间,c#,asp.net-mvc,linq,linq-to-sql,C#,Asp.net Mvc,Linq,Linq To Sql,我有一个主题父表和一个主题表的子表Post 在Linq查询中,我试图从链接的post表中返回最后一个post日期,但是,如果没有post,那么下面的查询将失败,因为DateTime不可为空: 转换为值类型“DateTime”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型。 查询是: var topic = db.Topics.Include(x => x.Posts).Include(x => x.Forum).Where(x => x.Forum

我有一个主题父表和一个主题表的子表Post

在Linq查询中,我试图从链接的post表中返回最后一个post日期,但是,如果没有post,那么下面的查询将失败,因为DateTime不可为空:

转换为值类型“DateTime”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型。

查询是:

var topic = db.Topics.Include(x => x.Posts).Include(x => x.Forum).Where(x => x.ForumId==id)
           .Select(t => new TopicViewModel
             {
                 TopicId =t.TopicId,
                 ForumId=t.ForumId,
                 Title=t.Title,
                 DateOfTopic=t.DateOfPost,
                 Replies=t.Posts.Count()-1,
                 Author=t.Author,
                 Views = t.Views,
                 LastPost = t.Posts.OrderByDescending(x => x.DateOfPost).FirstOrDefault().Author,
                 LastPostDate = t.Posts.OrderByDescending(x => x.DateOfPost).FirstOrDefault().DateOfPost
             }).OrderByDescending(x=> x.DateOfTopic).ToList();
我的ViewModel是:

public class TopicViewModel
{
    public int TopicId { get; set; }
    [Required]
    public string Title { get; set; }
    public string Author { get; set; }
    public DateTime DateOfTopic { get; set; }
    public int Replies { get; set; }
    public int Views { get; set; }
    public string LastPost { get; set; }
    public DateTime LastPostDate { get; set; }
    public int ForumId { get; set; }
}
是否有任何更改此行的方法:

LastPostDate = t.Posts.OrderByDescending(x => x.DateOfPost).FirstOrDefault().DateOfPost

…以便在DateOfPost为null时不会出错?

您可以将属性设置为可为null

public class x {
public DateTime? nullableDate {get; set;}
}

这将解决您的问题。问号确保您可以在
nullableDate
属性中使用
Null
如果存在空值,您可以使用
.GetValueOrDefault()
指定默认值:

LastPostDate = t.Posts
    .OrderByDescending(x => x.DateOfPost)
    .AsEnumerable()
    .FirstOrDefault()
    .DateOfPost.GetValueOrDefault(DateTime.MinValue);
或者,您可以使模型中的
LastPostDate
为空:

public class TopicViewModel
{
    public int TopicId { get; set; }
    [Required]
    public string Title { get; set; }
    public string Author { get; set; }
    public DateTime DateOfTopic { get; set; }
    public int Replies { get; set; }
    public int Views { get; set; }
    public string LastPost { get; set; }
    public DateTime? LastPostDate { get; set; }
    public int ForumId { get; set; }
}

我通常不在视图模型中使用可为空的类型,并在可能的情况下设置默认值。

e如果数据库中的DateOfPost列可为空,则实体中的DateTime和viewmodel属性也应为空。或者,如果您不想在视图模型中使用null,您可以使用null合并器

t.Posts.OrderByDescending(x => x.DateOfPost).FirstOrDefault().DateOfPost ?? DefaultDate

使用可为Null的类型:
DateTime?
Hi-这会导致错误“System.DateTime”不包含“GetValuerDefault”的定义,并且找不到接受“System.DateTime”类型的第一个参数的扩展方法“GetValuerDefault”-thanksHi,很抱歉,我做了一个改变,应该可以阻止这个错误。我想我已经试过了!!-非常感谢。(如果允许,我将标记为答案)