如何在 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();
}
我有两个模型
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();
}