2013-06-20 95 views
3

我有一个主题父表和一个邮政表拼接到主题表。ASP.Net MVC Linq to Sql如何处理空的日期时间

我想在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(); 

我的视图模型为:

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

使用可空类型:?''日期时间 – MarcinJuraszek

回答

6

你可以让你的财产Nullable

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

这应该可以解决您的问题。该问号可以使您有NullnullableDate财产

+1

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

1

你可以使用.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; } 
} 

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

+0

嗨 - 这给出了错误'System.DateTime'不包含'GetValueOrDefault'的定义和没有扩展方法'GetValueOrDefault'接受类型'System.DateTime'可以找到' - 谢谢 – Mark

+0

嗨,对不起,我做了一个改变,应该停止这个错误。 – Oliver

1

e如果数据库中的DateOfPost列为空,那么实体中的DateTime也应该为空,就像viewmodel Property一样。另外,如果你不想在你的视图模型为空即可我们空聚结器

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