【发布时间】: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