【问题标题】:One LINQ query to get counts from several entities when using entity framework core使用实体框架核心时从多个实体获取计数的一个 LINQ 查询
【发布时间】:2020-04-05 16:36:53
【问题描述】:

我正在处理从多个实体返回计数的 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 表为空,我发现查询会崩溃。我尝试了不同的方法,从查询中删除了这部分代码:

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 视图,但这对我来说很讨厌,因为我需要为它创建单独的迁移,并且任何时候我都必须添加一些更改 我需要使用新迁移来更新视图的代码。 有任何想法吗?干杯

【问题讨论】:

  • 为什么不var usersCount = await Context.UserAccounts.CountAsync(); var guestUsersCount = await .... return (userCount, guestUsersCount , ....);?一个查询没有意义(在这种情况下),因为在 sql 端它将一个一个地执行
  • var usersCount = await Context.UserAccounts.CountAsync(); 我也在想同样的事情。无法弄清楚这些表是如何相关的。
  • @Selvin 唯一的区别是 OP 的查询发生在从客户端到数据库的一次调用中。但我认为这种创建查询“批处理”的方式有点 hacky。
  • 你能分享你的模型吗? @GoldenAge
  • @FurkanÖztürk 有什么用?为了简化问题,您可以认为实体之间没有依赖关系

标签: c# linq .net-core entity-framework-core


【解决方案1】:

这是一个单一的 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();

【讨论】:

  • 一个词:过度工程。
  • 我知道,只是想提供问题的要求:)
猜你喜欢
  • 2019-05-17
  • 1970-01-01
  • 2020-07-19
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
相关资源
最近更新 更多