Bri*_*per 3 c# sum linq-to-sql
我有一个列出国家的数据库.每个国家可能有零个或多个啤酒厂,每个啤酒厂零个或多个啤酒.我将这些国家分类为有多少啤酒来自它们的顺序.为此,我制作了这段代码: -
sorted_countries = db.Countries.OrderBy(x => x.Breweries.Sum(y => y.Beers.Count()));
Run Code Online (Sandbox Code Playgroud)
数据库中的一个国家没有酿酒厂,正如人们所预料的那样,这个国家位居榜首.但如果我颠倒顺序: -
sorted_countries = unsorted_countries.OrderBy(x => -1*x.Breweries.Sum(y => y.Beers.Count()));
Run Code Online (Sandbox Code Playgroud)
没有啤酒厂的国家仍然出现在显示屏的顶部.
为什么会这样?
在我看来,如果将.Sum方法应用于空集合,结果应始终为零,并且它将正常排序.但即使选择了逆序,它似乎总是先行.
(我可以很容易地解决问题,像这样: -
sorted_countries = db.Countries.OrderBy(x => x.Breweries.Count() > 0 ? 0 : 1)
.ThenBy(x => -1*x.Breweries.Sum(y => y.Beers.Count()));
Run Code Online (Sandbox Code Playgroud)
但我想知道发生了什么,以及为什么这是必要的.)
编辑
正如Andy G所说,我试过这个: -
sorted_countries = db.Countries.OrderByDescending(x => x.Breweries.Sum(y => y.Beers.Count()));
Run Code Online (Sandbox Code Playgroud)
然后没有啤酒厂的国家出现在预期的最底层(这是解决问题的一种比我更好的方法).
编辑
正如Jon Skeet所建议的,为"times -1"方法生成的SQL是......
SELECT [t0].[CountryID], [t0].[Name], [t0].[Code]
FROM [dbo].[Country] AS [t0]
ORDER BY (
SELECT SUM([t3].[value])
FROM (
SELECT @p0 * ((
SELECT COUNT(*)
FROM [dbo].[Beer] AS [t2]
WHERE [t2].[BreweryID] = [t1].[BreweryID]
)) AS [value], [t1].[CountryID]
FROM [dbo].[Brewery] AS [t1]
) AS [t3]
WHERE [t3].[CountryID] = [t0].[CountryID]
), [t0].[Name]
Run Code Online (Sandbox Code Playgroud)
而OrderByDescending产生: -
SELECT [t0].[CountryID], [t0].[Name], [t0].[Code]
FROM [dbo].[Country] AS [t0]
ORDER BY (
SELECT SUM([t3].[value])
FROM (
SELECT (
SELECT COUNT(*)
FROM [dbo].[Beer] AS [t2]
WHERE [t2].[BreweryID] = [t1].[BreweryID]
) AS [value], [t1].[CountryID]
FROM [dbo].[Brewery] AS [t1]
) AS [t3]
WHERE [t3].[CountryID] = [t0].[CountryID]
) DESC, [t0].[Name]
Run Code Online (Sandbox Code Playgroud)