为什么OrderBy总是返回零到顶部?

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)

And*_*y G 5

如果Country没有Breweries,那么您按null值排序.这些首先按升序排列OrderBy.

乘以-1不会改变null's 的位置OrderByDescending.