2013-06-20 4 views
3

У меня есть родительская таблица темы и таблица Post, привязанная к таблице Topic.ASP.Net MVC Linq to Sql как обрабатывать нулевое время datetime

То, что я пытаюсь сделать в запросе 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

ответ

6

Вы можете сделать вашу собственность Nullable

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

Это должно устранить проблему. Questionmark гарантирует, что вы можете иметь Null в nullableDate собственности

+1

я думал, что я пытался это !! - Спасибо. (Я буду отмечать как ответ, когда SO разрешает) – Mark

1

Вы можете использовать .GetValueOrDefault() указать значение по умолчанию, если есть нулевое значение:

LastPostDate = t.Posts 
    .OrderByDescending(x => x.DateOfPost) 
    .AsEnumerable() 
    .FirstOrDefault() 
    .DateOfPost.GetValueOrDefault(DateTime.MinValue); 

В качестве альтернативы, вы можете сделать LastPostDate Nullable в модели:

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 в базе данных имеет значение NULL, значение DateTime в вашем объекте также должно быть равно NULL, как и ваше свойство viewmodel. Кроме того, если вы не хотите нуль в вашей модели представления вы можете нам нулевой коагулятор

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