ASP.Net MVC中如何处理空的datetime问题,使用Linq to Sql。

3
我有一个Topic父表,和一个子表Post链接到Topic表上。我希望在Linq查询中返回最后一篇文章的日期,但是如果没有文章,下面的查询将失败,因为DateTime不可为空:'The cast to value type 'DateTime' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.' 查询如下:
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为空的情况下不出错?


1
使用可空类型:DateTime? - MarcinJuraszek
3个回答

6
您可以使您的属性Nullable
public class x {
public DateTime? nullableDate {get; set;}
}

这应该可以解决你的问题。问号确保你可以在nullableDate属性中使用Null


1
我以为我已经尝试过那个了!!- 谢谢。 (当SO允许时,我会标记为答案) - Mark

1
您可以使用.GetValueOrDefault()来指定默认值,以便在出现null值时使用:
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; }
}

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


嗨 - 这会导致错误“System.DateTime”不包含“GetValueOrDefault”的定义,也找不到接受类型为“System.DateTime”的第一个参数的扩展方法“GetValueOrDefault”- 谢谢。 - Mark
嗨,抱歉,我已经进行了更改,应该可以解决这个错误。 - Oliver

1
如果数据库中的DateOfPost列可为空,则实体中的DateTime也应该是可为空的,视图模型属性也应该是可为空的。或者,如果您不想在视图模型中使用null,可以使用null合并运算符。
t.Posts.OrderByDescending(x => x.DateOfPost).FirstOrDefault().DateOfPost ?? DefaultDate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接