我有这个: 板:
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数据。 但我想问的还有其他方法吗?
答案 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到实体,它可能有一些更优雅的方法来完成你想要完成的任务。不过,我不是那种技术的大专业人士。