【问题标题】:EF Core - Count from a specific columnEF Core - 从特定列计数
【发布时间】:2020-05-20 12:23:08
【问题描述】:

几乎让我的 EF Core 查询正常工作...这是生成的 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]

需要的是(让 Count 查看特定的列/表)

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-code-first ef-core-3.1


    【解决方案1】:

    我不是 EF 开发人员,但使用 SQL Server 已经有一段时间了。在 SQL Server 中,我将使用 COUNT(DISTINCT c.ID) 来消除您可能从 JOINS 获得的任何重复项。

    如果由于模型而无法重复,则 COUNT(*) 应该足够了。

    也许这可能会有所帮助: https://entityframeworkcore.com/knowledge-base/51892585/linq-select-distinct-count-performed-in-memory

    【讨论】:

    • 感谢 Patrik 的回答 - 因为 c.ID 来自连接(点击)它已经是不同的,但它是左连接,所以 Count(c.ID) - 或 c 表中的任何内容需要,否则 Count(*) 将始终返回 1,并且永远不会返回 0 - 通过基于 LeftJoin 关系进行计数,我可以在没有相应记录时返回 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2018-07-09
    • 2018-08-02
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多