3

Topic 親テーブルと、Topic テーブルの子である Post テーブルがあります。

Linq クエリ内でやろうとしているのは、リンクされた Post テーブルから最後の投稿日を返すことですが、投稿がない場合、DateTime は null 許容ではないため、以下のクエリは失敗します。

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 が null の場合にエラーにならないようにするには?

4

3 に答える 3

6

あなたの財産を作ることができますNullable

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

これで問題が解決するはずです。Null疑問符は、nullableDateプロパティに含めることができることを確認します

于 2013-06-20T07:37:20.117 に答える
1

.GetValueOrDefault()null 値がある場合は、デフォルト値を指定するために使用できます。

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; }
}

私は通常、ビュー モデルで null 許容型を使用せず、可能な場合は既定値を設定します。

于 2013-06-20T07:37:45.567 に答える