如何在 EF Core 中使用 .Include() 和 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; }
}

一个视图模型

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 核心 3.1

解决方法

由于您使用的是 Ef 3.1 Include,因此不应使用 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();
    }