微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 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();
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。