【问题标题】:ASP.Net MVC Linq to Sql how to handle a null datetimeASP.Net MVC Linq to Sql 如何处理空日期时间
【发布时间】:2014-05-23 19:34:26
【问题描述】:

我有一个 Topic 父表和一个 Post 表,它是 Topic 表的子表。

我在 Linq 查询中尝试做的是从链接的 Post 表中返回最后一个发布日期,但是,如果没有 Posts,那么下面的查询将失败,因为 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 为空,它不会出错?

【问题讨论】:

  • 使用可空类型:DateTime?

标签: c# asp.net-mvc linq linq-to-sql


【解决方案1】:

您可以将您的财产设为Nullable

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

这应该可以解决您的问题。问号确保您可以在nullableDate 属性中拥有Null

【讨论】:

  • 我以为我试过了!! - 谢谢。 (如果允许,我会标记为答案)
【解决方案2】:

如果有空值,您可以使用.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; }
}

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

【讨论】:

  • 嗨 - 给出错误“System.DateTime”不包含“GetValueOrDefault”的定义,并且找不到接受“System.DateTime”类型的第一个参数的扩展方法“GetValueOrDefault” - 谢谢
  • 嗨,很抱歉,我已经做出了改变,应该可以阻止这个错误。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多