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的开发者,但已经使用SQL Server工作了一段时间。在SQL Server中,我会使用COUNT(DISTINCT c.ID)来消除你可能从JOINS中得到的任何重复。
如果由于模型的原因,重复是不可能的,那么COUNT(*)就足够了。
也许这个会有帮助。https:/entityframeworkcore.comknowledge-base51892585linq-select-distinct-count-performed-in-memory.