有没有其他方法可以使此 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 或类似的东西中收集数据。但是我想问的是,还有其他方法可以做到吗?
如果你查看你的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 到实体,它可能有一些更优雅的方式来完成您尝试完成的任务。不过,我不是这项技术的忠实专家。