如何在 EF Core 中使用 .Include() 和 ViewModel

How to use .Include() in EF Core with ViewModel

我有两个模型

public class PageGroup
{
    public PageGroup()
    {
        Pages = new HashSet<Page>();
    }

    public int GroupID { get; set; }
    public string GroupTitle { get; set; }
    public virtual ICollection<Page> Pages { get; set; }
}

public class Page
{
    public Page()
    {
        
    }

    public int PageID { get; set; }
    public int GroupID { get; set; }
    public string PageTitle { get; set; }
    public string PageText { get; set; }
    public virtual PageGroup PageGroup { get; set; }
}

和一个 ViewModel

public class ShowGroupsViewModel
{
    public int GroupID { get; set; }
    public string GroupTitle { get; set; }
    public int PageCount { get; set; }
}

我用这个方法填充了这个ViewModel

public async Task<IEnumerable<ShowGroupsViewModel>> GetListGroupsServiceAsync()
    {
        return await _context.PageGroups.Include(p => p.Pages.Count).Select(pa => new ShowGroupsViewModel()
        {
            GroupID = pa.GroupID,
            GroupTitle = pa.GroupTitle,
            PageCount = pa.Pages.Count
        }).ToListAsync();
    }

PageCount 不起作用。当 运行 项目的值为零时。我该如何填写这个属性? 我用的是.net core 3.1

由于您使用的是 Ef 3.1,因此不应使用 Include,因为 Include("Pages") 将从 SQl 服务器获取所有 Page 实例并在此之后对它们进行计数。

在 EF Net5 中,使用 Include 会更简单,但由于您使用的是 EF 3.1,请尝试以下操作:

public async Task<IEnumerable<ShowGroupsViewModel>> GetListGroupsServiceAsync()
    {
    return await ( from pg in  _context.PageGroups
           join p in context.Pages
           on pg.GroupId equals p.GroupId 
           group pg by new { pg.GroupId, pg.GroupTitle}  into g
            select new ShowGroupsViewModel{
             GroupId = g.Key.GroupId,
             GroupTitle =g.Key.GroupTitle
             PagesCount = g.Count()
          }).ToListAsync();
    }