EF核心 - 从特定的列中计数

问题描述 投票:0回答:1

I 几乎 有我的EF核心查询工作... 这是SQL的生成(注意Count(*)。

SELECT [u].[Key], [u].[Url], [u].[CreatedBy], [u].[CreatedOn], COUNT(*) AS [Clicks]
FROM [URLs] AS [u]
LEFT JOIN [OwnerUrls] AS [o] ON [u].[Key] = [o].[ShortUrlKey]
LEFT JOIN [Clicks] AS [c] ON [u].[Key] = [c].[ShortUrlKey]
GROUP BY [u].[Key], [u].[Url], [u].[CreatedBy], [u].[CreatedOn]

我的 需要 属于

SELECT [u].[Key], [u].[Url], [u].[CreatedBy], [u].[CreatedOn], COUNT(c.ID) AS [Clicks]
FROM [URLs] AS [u]
LEFT JOIN [OwnerUrls] AS [o] ON [u].[Key] = [o].[ShortUrlKey]
LEFT JOIN [Clicks] AS [c] ON [u].[Key] = [c].[ShortUrlKey]
GROUP BY [u].[Key], [u].[Url], [u].[CreatedBy], [u].[CreatedOn]

下面是我使用的EF查询......

            query = (from u in db.URLs
                         join ou in db.OwnerUrls on u.Key equals ou.ShortUrlKey into urlOwners
                         from subSet in urlOwners.DefaultIfEmpty()
                         join c in db.Clicks on u.Key equals c.ShortUrlKey into urlClicks
                         from subClicks in urlClicks.DefaultIfEmpty()

                         group subClicks by new { u.Key, u.Url, u.CreatedBy, u.CreatedOn } into g
                         select new ShortURL()
                         {
                             Key = g.Key.Key,
                             Url = g.Key.Url,
                             CreatedBy = g.Key.CreatedBy,
                             CreatedOn = g.Key.CreatedOn,
                             Clicks = g.Count()
                         });

我试过把g.Count()改成g.Select(x=>x.Id).Count(),但这只会让EF Core吐槽,抱怨客户端评估与服务器端评估等等。

我应该提一下,我加入第一个模型(OwnerUrls)的原因是为了支持一个where子句,我在这里没有加入......

谢谢!我的EF Core查询几乎已经可以使用了。

ef-code-first ef-core-3.1
1个回答
0
投票

我不是EF的开发者,但已经使用SQL Server工作了一段时间。在SQL Server中,我会使用COUNT(DISTINCT c.ID)来消除你可能从JOINS中得到的任何重复。

如果由于模型的原因,重复是不可能的,那么COUNT(*)就足够了。

也许这个会有帮助。https:/entityframeworkcore.comknowledge-base51892585linq-select-distinct-count-performed-in-memory.

© www.soinside.com 2019 - 2024. All rights reserved.