[英]How to build several left join query in Entity Framework Core for several many to one related entities
[英]One LINQ query to get counts from several entities when using entity framework core
我正在处理从多个实体返回计数的 LINQ 查询。 我创建了这种查询:
public async Task<(int UsersCount, int GuestUsersCount, int WorkItemsCount, int WorkGroupsCount)> GetSiteInfoAsync()
{
var counters = await (from user in Context.UserAccounts
from guestUser in Context.GuestAccounts
from workItem in Context.WorkItems
from workGroup in Context.WorkGroups
select new
{
usersCount = Context.UserAccounts.Count(),
guestUsersCount = Context.GuestAccounts.Count(),
workGroupsCount = Context.WorkGroups.Where(x => x.IsActive).Count(),
workItemsCount = Context.WorkItems.Count()
}).FirstOrDefaultAsync();
return (counters.usersCount, counters.guestUsersCount, counters.workItemsCount, counters.workGroupsCount);
}
如果WorkItem
表为空,我发现查询会WorkItem
。 我尝试了不同的方法,从查询中删除了这部分代码:
from guestUser in Context.GuestAccounts
from workItem in Context.WorkItems
from workGroup in Context.WorkGroups
然后查询工作,因为在我的情况下,我知道UserAccounts
表永远不会为空,因为数据库中总是有一些默认用户:
var counters = await (from user in Context.UserAccounts
select new
{
usersCount = Context.UserAccounts.Count(),
guestUsersCount = Context.GuestAccounts.Count(),
workGroupsCount = Context.WorkGroups.Where(x => x.IsActive).Count(),
workItemsCount = Context.WorkItems.Count()
}).FirstOrDefaultAsync();
我只是想知道是否有更清洁的解决方案? 它只需要一个 LINQ 查询。 我还考虑过创建一个 SQL 视图,但这对我来说很讨厌,因为我需要为它创建单独的迁移,并且每当我必须向代码添加一些更改时,我需要使用新的迁移来更新视图。 有任何想法吗? 干杯
这是一个单一的 LINQ 查询解决方案,我希望这会有所帮助,
var result = Context.UserAccounts.Select(x => new List<int>() { 1, 0, 0, 0 }).Union(Context.GuestAccounts.Select(y => new List<int>() { 0, 1, 0, 0 }))
.Union(Context.WorkGroups.Where(x => x.IsActive).Select(z => new List<int>() { 0, 0, 1, 0 })).Union(Context.WorkItems.Select(t => new List<int>() { 0, 0, 0, 1 })).ToList();
数据库请求后,您可以获得出现次数的计数,如下所示,
var count1 = result.Where(x => x[0] == 1).Count();
var count2 = result.Where(x => x[1] == 1).Count();
var count3 = result.Where(x => x[2] == 1).Count();
var count4 = result.Where(x => x[3] == 1).Count();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.