我有以下问题,我期待着一些结果.但我只得到了一个结果.

var results = await DbContext.Trucks
    .Where(t => t.Departure.HasValue)
    .Select(t => new
    {
        t.Departure!.Value.Year,
        t.Departure!.Value.Month,
        Quantity = t.InboundQuantity + t.ToTransfers.Sum(x => x.Quantity) - t.FromTransfers.Sum(x => x.Quantity)
    })
    .GroupBy(t => new { t.Year, t.Month })
    .ToDictionaryAsync(g => new DateTime(g.Key.Year, g.Key.Month, 1), g => g.Sum(x => x.Quantity));

Results个个

results Count = 1
+ [0]   {[{7/1/2021 12:00:00 AM}, 3842405714]}

如果我重写查询以将所有行加载到内存中,然后进行分组,则会得到预期数量的结果.

var test = DbContext.Trucks
    .Where(t => t.Departure.HasValue)
    .Select(t => new
    {
        t.Departure!.Value.Year,
        t.Departure!.Value.Month,
        Quantity = t.InboundQuantity + t.ToTransfers.Sum(x => x.Quantity) - t.FromTransfers.Sum(x => x.Quantity)
    })
    .ToList();

var test2 = test
    .GroupBy(t => new { t.Year, t.Month })
    .ToDictionary(g => new DateTime(g.Key.Year, g.Key.Month, 1), g => g.Sum(x => x.Quantity));

Results个个

test2   Count = 27
+ [0]   {[{1/1/2022 12:00:00 AM}, 95309170]}
+ [1]   {[{2/1/2022 12:00:00 AM}, 79737674]}
+ [2]   {[{3/1/2022 12:00:00 AM}, 173875538]}
+ [3]   {[{7/1/2021 12:00:00 AM}, 125219196]}
+ [4]   {[{8/1/2021 12:00:00 AM}, 110993954]}
+ [5]   {[{10/1/2021 12:00:00 AM}, 129282632]}
+ [6]   {[{11/1/2021 12:00:00 AM}, 160927222]}
+ [7]   {[{12/1/2021 12:00:00 AM}, 117813444]}
+ [8]   {[{9/1/2021 12:00:00 AM}, 26260420]}
+ [9]   {[{4/1/2022 12:00:00 AM}, 161695966]}
+ [10]  {[{5/1/2022 12:00:00 AM}, 184781001]}
+ [11]  {[{6/1/2022 12:00:00 AM}, 146985217]}
+ [12]  {[{7/1/2022 12:00:00 AM}, 84260160]}
+ [13]  {[{8/1/2022 12:00:00 AM}, 89769875]}
+ [14]  {[{10/1/2022 12:00:00 AM}, 187958697]}
+ [15]  {[{11/1/2022 12:00:00 AM}, 175034225]}
+ [16]  {[{9/1/2022 12:00:00 AM}, 108421771]}
+ [17]  {[{1/1/2023 12:00:00 AM}, 179720773]}
+ [18]  {[{12/1/2022 12:00:00 AM}, 110000415]}
+ [19]  {[{2/1/2023 12:00:00 AM}, 210461751]}
+ [20]  {[{3/1/2023 12:00:00 AM}, 232239876]}
+ [21]  {[{4/1/2023 12:00:00 AM}, 176482465]}
+ [22]  {[{5/1/2023 12:00:00 AM}, 218732769]}
+ [23]  {[{6/1/2023 12:00:00 AM}, 186324324]}
+ [24]  {[{7/1/2023 12:00:00 AM}, 151700649]}
+ [25]  {[{8/1/2023 12:00:00 AM}, 142653374]}
+ [26]  {[{9/1/2023 12:00:00 AM}, 75763156]}

我可能在这里漏掉了一些愚蠢的东西,但我不知道该怎么解释.

为什么第一个查询没有按预期工作?

Update

如果有人好奇,我使用以下语法使这个查询正确工作.请注意,将第二个参数设置为GroupBy(),并对ToDictionaryAsync()调用进行了微小更改.

var results = await query
    .Where(t => t.Departure.HasValue)
    .Select(t => new
    {
        t.Departure!.Value.Year,
        t.Departure!.Value.Month,
        Quantity = t.InboundQuantity + t.ToTransfers.Sum(x => x.Quantity) - t.FromTransfers.Sum(x => x.Quantity)
    })
    .GroupBy(t => new { t.Year, t.Month }, x => x.Quantity)
    .ToDictionaryAsync(g => new DateTime(g.Key.Year, g.Key.Month, 1), g => g.Sum());

推荐答案

GROUPING没有聚合就没有降临,ToDictionaryAsync正在try 在客户端枚举IGrouping<,>.在呼叫ToDictionaryAsync之前添加额外的Select:

var results = await DbContext.Trucks
    .Where(t => t.Departure.HasValue)
    .Select(t => new
    {
        t.Departure!.Value.Year,
        t.Departure!.Value.Month,
        Quantity = t.InboundQuantity + t.ToTransfers.Sum(x => x.Quantity) - t.FromTransfers.Sum(x => x.Quantity)
    })
    .GroupBy(t => new { t.Year, t.Month })
    .Select(g = new 
    { 
        g.Key.Year, 
        g.Key.Month,
        Quantity = g => g.Sum(x => x.Quantity)
    })
    .ToDictionaryAsync(x => new DateTime(x.Year, x.Month, 1), g => x.Quantity);

更新,因为在这里我们有EF核心SQL生成限制,所以准备了解决方法:

var trucks = DbContext.Trucks
    .Where(t => t.Departure.HasValue);

var toSummary = 
    from t in trucks
    from tr in t.ToTransfers
    group tr by new
    {
        t.Departure!.Value.Year,
        t.Departure!.Value.Month,        
    } into g
    select new 
    {
        g.Key.Year,
        g.Key.Month,
        ToQuantity = g.Sum(x => x.Quantity)
    };

var fromSummary = 
    from t in trucks
    from tr in t.FromTransfers
    group tr by new
    {
        t.Departure!.Value.Year,
        t.Departure!.Value.Month,        
    } into g
    select new 
    {
        g.Key.Year,
        g.Key.Month,
        FromQuantity = g.Sum(x => x.Quantity)
    };

var query = 
    from t in trucks
    from to in toSummary
        .Where(to => t.Year == t.Departure!.Value.Year && t.Month == t.Departure!.Value.Month)
        .DefaultIfEmpty()
    from f in fromSummary
        .Where(f => f.Year == t.Departure!.Value.Year && f.Month == t.Departure!.Value.Month)
        .DefaultIfEmpty()
    select new 
    {
        g.Key.Year, 
        g.Key.Month,
        Quantity = t.InboundQuantity + ((int?)to.ToQuantity) ?? 0 - ((int?)f.FromQuantity) ?? 0
    }


var results = await query
    .ToDictionaryAsync(x => new DateTime(x.Year, x.Month, 1), g => x.Quantity);

Csharp相关问答推荐

System.Data.SQLite:判断SQLite数据库是否为空(任何表中至少有一行)

如何禁用ASP.NET MVP按钮,以便无法使用开发人员控制台重新启用它

如何在Visual Studio中为C# spread操作符设置格式规则?

EF Core 8—应用客户端投影后无法转换集操作

一小时后,自定义缓存停止在App Insight中保存

读取配置文件(mytest. exe. config)

如何分配对象后的class的属性?

(乌龙)1&#比c#中的UL&#慢吗?

更新产品但丢失产品ASP.NET Core的形象

在路由中使用枚举

UWP中的任务和界面

如何在没有前缀和可选后缀的情况下获取Razor Page Handler方法名称?

WinForms在Linux上的JetBrains Rider中的应用

HelperText属性不支持复杂内容(混合C#和标记)

链接到字典字符串.拆分为(.Key,.Value)

当空判断结果赋给变量时,为什么会出现可能空异常警告的解引用?

.NET 8在appsettings.json中核心使用词典URI、URI&>

使用免费的DotNet库从Azure函数向Azure文件共享上的现有Excel文件追加行

项目参考和方法签名问题

为什么INTEGER在通过反射调用时对空对象返回TRUE,而在INTEGER上调用时返回FALSE?