还有另一种方法可以使这个LINQ查询工作吗?

时间:2011-05-08 17:25:37

标签: c# linq-to-entities

我有这个: 板:

    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或类似的东西中收集nessesary数据。 但我想问的还有其他方法吗?

2 个答案:

答案 0 :(得分:3)

如果您查看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属性应该已经实现,因为它没有被标记为虚拟)。

答案 1 :(得分:1)

这应该有效:

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到实体,它可能有一些更优雅的方法来完成你想要完成的任务。不过,我不是那种技术的大专业人士。