实体框架选择单项导航导航

时间:2016-01-21 22:38:15

标签: c# entity-framework lambda

我不确定要搜索什么,因此无法得到答案。

我有以下设置:

public class CommunitySubForum
{
    [Key]
    public Int32 Id { get; set; }
    public String Title { get; set; }
    public String Description { get; set; }
    public Int32 DisplayOrder { get; set; }
    public Int32 ParentForumId { get; set; }
    public virtual CommunityForum ParentForum { get; set; }
    public virtual List<CommunityThread> Threads { get; set; }
}

public class CommunityThread
{
    [Key]
    public Int32 Id { get; set; }
    public String Title { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateEdited { get; set; }
    public Boolean IsLocked { get; set; }
    public Int32 ParentForumId { get; set; }
    public virtual CommunitySubForum ParentForum {get;set;}
    public virtual List<CommunityPost> Posts { get; set; }
    public virtual MLUser MlUser { get; set; }
    public Int32 MLUserId { get; set; }
}

public class CommunityPost
{
    public Int32 Id { get; set; }
    public String Content { get; set; }
    public DateTime CreateDate { get; set; }
    public DateTime EditDate { get; set; }
    public Int32 ThreadId { get; set; }
    public virtual CommunityThread Thread { get; set; }
    public virtual MLUser MlUser{ get; set; }
    public Int32 MLUserId { get; set; }
    public Int32 MediaItemParentId { get; set; }
    public BaseMediaItem MediaItem { get; set; }
}

现在,我要做的是,在子论坛中获取最新帖子的帖子。

获取最新的线程没有问题,但我不确定如何以高效的方式获取最新帖子的线程。优选用λ

显然,我可以获得最新的帖子并获取线程并将其添加到我的subforum obj中的单独查询中,但我希望在单个查询中获取它。

编辑:我需要获得所有子论坛的列表,其中包含一个包含最新帖子的帖子。像这样:http://i.imgur.com/8RHvqxK.png

2 个答案:

答案 0 :(得分:1)

你需要做这样的事情:

var result =
    subforums
    .Select(sf => new 
    {
        SubForum = sf,
        MostRecentPost = 
            sf.Threads
            .SelectMany(t => t.Posts)
            .OrderByDescending(p => p.CreateDate)
            .FirstOrDefault()

    })
    .ToList();

此查询将为您提供一个匿名类型对象列表,其中包含CommunitySubForum个对象及相应的最新CommunityPost对象。

如果您只对这些对象的某些属性感兴趣,可以轻松修改查询以选择特定属性。

如果您想要最新的主题,只需使用Select选择Thread或其任何属性,如下所示:

var result =
    subforums
    .Select(sf => new 
    {
        SubForum = sf,
        MostRecentThread = 
            sf.Threads
            .SelectMany(t => t.Posts)
            .OrderByDescending(p => p.CreateDate)
            .Select(p => p.Thread)
            .FirstOrDefault()

    })
    .ToList();

答案 1 :(得分:1)

收集每个主题的最新发布日期,然后按照此最新发布日期对主题进行排序以获取最新发布日期:

from f in Subforums
select new
{
    f.Title,
    ThreadWithNewestPost = (
                               from t in f.Threads
                               select new
                               {
                                   t.Title,
                                   NewestPostDate = t.Posts.Max(p => p.CreateDate )
                               }
                           ).OrderByDescending(x => x.NewestPostDate)
                            .FirstOrDefault()
}

我认为Thread始终有Posts,否则你应该在查询中检查它。