【问题标题】:LINQ GroupBy by Anonymous Object Not actually grouping匿名对象的 LINQ GroupBy 实际上没有分组
【发布时间】:2019-08-16 20:28:42
【问题描述】:

我想知道为什么我的 LINQ GroupBy 语句实际上没有正确分组我的对象集。我仍然会得到我开始使用的所有对象,即使它们共享相同的 Key。

这是我尝试过的代码:

var snapshot = snapshotService.GetSnapshot(siids, warehouseId)
   .GroupBy(a => new
   {
      a.SIId,
      a.WarehouseId,
      a.Treatment,
      a.UnitOfMeasure
   })
   .Select(a => new Snapshot
   {
      SIId = a.Key.SIId,
      WarehouseId = a.Key.WarehouseId,
      Treatment = a.Key.Treatment,
      UnitOfMeasure = a.Key.UnitOfMeasure,
      TotalAmount = a.Sum(sum => sum.TotalAmount),
      Available = a.Sum(sum => sum.Available),
      Unavailable = a.Sum(sum => sum.Unavailable)
   }).ToList();

键是 SIId、WarehouseId、Treatment 和 UnitOfMeasure。我想为每个组合键设置一个返回集。相反,我为每个组合键获得了多个返回集,这太烦人了! TotalAmount、Available 和 Unavailable 也有不同的值。就好像 GroupBy 声明完全被惹恼了一样。

例如:如果我有一个对象

{SIId = 1, WareHouseId = 1, Treatment = 1, UnitOfMeasure = 1,
  TotalAmount = 1, Available = 1, Unavailable = 1}
{SIId = 1, WareHouseId = 1, Treatment = 1, UnitOfMeasure = 1,
  TotalAmount = 2, Available = 2, Unavailable = 2}

我希望回报是:

{SIId = 1, WareHouseId = 1, Treatment = 1, UnitOfMeasure = 1,
  TotalAmount = 3, Available = 3, Unavailable = 3}

但是我得到了复合列表

{
  {SIId = 1, WareHouseId = 1, Treatment = 1, UnitOfMeasure = 1,
    TotalAmount = 1, Available = 1, Unavailable = 1},
  {SIId = 1, WareHouseId = 1, Treatment = 1, UnitOfMeasure = 1,
    TotalAmount = 2, Available = 2, Unavailable = 2}
}.

什么给了?

【问题讨论】:

  • 您如何查看这些结果?如果您在调试器中查看,您可能实际上看不到分组数据,因为它只会在您枚举它们时以组的形式为您提供结果。
  • 邮递员返回
  • @NICOBHHCCoder 邮递员不是您调试事物的方式。
  • 我没有调试...
  • 您收到一个 http 响应,因此您的组是元素对象而不是文本值。使用:a.SIId.Text、a.WarehouseId.Text、a.Treatment.Text、a.UnitOfMeasure.Text

标签: c# linq


【解决方案1】:

这不是一个完整的答案,但我调整了您的代码以执行以显示代码没有问题并且它返回了预期的内容

void Main()
{
    var snapshot = ((List<Snapshot>)snapshotService.GetSnapshot())
   .GroupBy(a => new
   {
       a.SIId,
       a.WarehouseId,
       a.Treatment,
       a.UnitOfMeasure
   })
   .Select(a => new Snapshot
       {
           SIId = a.Key.SIId,
           WarehouseId = a.Key.WarehouseId,
           Treatment = a.Key.Treatment,
           UnitOfMeasure = a.Key.UnitOfMeasure,
           TotalAmount = a.Sum(sum => sum.TotalAmount),
           Available = a.Sum(sum => sum.Available),
           Unavailable = a.Sum(sum => sum.Unavailable)
      }).ToList();

      snapshot.Dump();    
}
public class Snapshot
{
    public int SIId { get; set; }
    public int WarehouseId {get;set;}
    public int Treatment { get; set; }
    public int UnitOfMeasure { get; set; }
    public int TotalAmount { get; set; }
    public int Available { get; set; }
    public int Unavailable { get; set; }
}

public static class snapshotService
{
    public static object GetSnapshot()
    {
        string x = "[{\"SIId\":1,\"WareHouseId\":1,\"Treatment\":1,\"UnitOfMeasure\":1,\"TotalAmount\":1,\"Available\":1,\"Unavailable\":1},{\"SIId\":1,\"WareHouseId\":1,\"Treatment\":1,\"UnitOfMeasure\":1,\"TotalAmount\":2,\"Available\":2,\"Unavailable\" :2}]";
        return JsonConvert.DeserializeObject<List<Snapshot>>(x);
    }
}


结果回来了:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多