繁体   English   中英

使用实体框架核心时从多个实体获取计数的一个 LINQ 查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM