有没有其他方法可以使此 LINQ 查询正常工作

本文关键字:常工作 工作 查询 方法 其他 可以使 LINQ 有没有 | 更新日期: 2023-09-27 17:55:17

好吧,我有这个:板:

    public class Board
{
    public int BoardID { get; set; }
    public string BoardName { get; set; }
    public string BoardDescription { get; set; }
    public int PostCount { get; set; }
    public int TopicCount { get; set; }
    public bool IsVisibile { get; set; }
    public Forum BelongToForum { get; set; }
    public List<Board> Boards { get; set; }
    public List<Topic> Topics { get; set; }
}

和论坛:

    public class Forum
{
    public int ForumID { get; set; }
    public string ForumName { get; set; }
    public string ForumDescription { get; set; }
    public List<Board> Boards { get; set; }
}

以及获得论坛与板的方法:

        public List<Forum> GetForums()
    {
        List<Forum> forums = new List<Forum>();
        _ctx = new ForumContext();
        forums = (from p in _ctx.Forums
                  select p).ToList();
        List<Forum> returnForm = new List<Forum>();
        foreach(Forum forum in forums)
        {
            List<Board> board = (from x in _ctx.Boards
                                 where x.BelongToForum.ForumID == forum.ForumID
                                 select x).ToList();
            forum.Boards = board;
            returnForm.Add(forum);
        }

        return returnForm;
    }

它按预期工作。但正如你所看到的,我使用了三个列表,并且 foreach 循环。对我来说看起来不太好。所以我有一个问题,有没有另一种方法可以让它工作?

我想我应该做另一个模型类,从 join 或类似的东西中收集数据。但是我想问的是,还有其他方法可以做到吗?

有没有其他方法可以使此 LINQ 查询正常工作

如果你查看你的Forum实体,它已经有一个Boards属性。您应该能够使用 Include() 在一个查询中具体化这些内容。

 forums = (from p in _ctx.Forums.Include("Boards")
           select p).ToList();

或使用强类型Include()

 forums = (from p in _ctx.Forums.Include( x=> x.Boards)
           select p).ToList();

你能澄清一下这是代码优先还是数据库优先吗?从您的示例中,它看起来像 POCO 模型的 DB 优先(首先使用代码,Boards 属性应该已经具体化,因为它没有标记为虚拟)。

这应该有效:

var returnForm =
    (
        from forum in _ctx.Forums
        join b in _ctx.Boards on forum.ForumID equals b.BelongsToForum.ForumID into boards
        select new { forum, boards }
    )
    .Select( x =>
        {
            x.forum.Boards = x.boards.ToList();
            return x.forum;
        } )
    .ToList();

棘手的部分是将板列表分配给forum.Boards属性。这不太符合 LINQ 的理念:LINQ 是关于通过某种转换从前一组数据创建下一组数据,而不是关于就地修改数据。

出于这个原因,这个作业部分有点难看。

但是,如果您使用的是 LINQ 到实体,它可能有一些更优雅的方式来完成您尝试完成的任务。不过,我不是这项技术的忠实专家。