【问题标题】:columns with same name but other with calculated one Linq具有相同名称但其他具有计算一个 Linq 的列
【发布时间】:2018-05-23 14:12:10
【问题描述】:

我在数据库中有类似的数据

1     CP     12
2     OB     8
1     CP     19
3     AB     22
2     OB     33
1     CP     19
3     AB     22

对它运行查询后我想要什么

2     OB     41
1     CP     60
3     AB     44

我试过了

 var abc = db.OilVolumes.GroupBy(x => new { x.OilType.OilTypeName, x.Weight }).Select(y => new 
{
oilType = y.Key.OilTypeName,
weight = y.Sum(z => z.Weight)
});

但我失败了...给我一个类似格式的

谢谢

【问题讨论】:

  • 解释数据转换的逻辑是什么。
  • 错字? 2 OB 41,不是 63
  • 我想从表中获取油量。第 2 列是油型,我不想重复油型。此外,我想分别计算每种类型的所有行的所有体积。
  • 第三行是重量。我想要每种类型的总重量并且不重复。只有一排有一种油类型及其所有重量

标签: c# sql linq duplicates


【解决方案1】:

从您的 GroupBy 中删除 x.Weight

var abc = db.OilVolumes.GroupBy(x => new { x.OilType.OilTypeName }).Select(y => new 
    {
     oilType = y.Key.OilTypeName,
     weight = y.Sum(z => z.Weight)
    });

【讨论】:

    【解决方案2】:

    数字和名字似乎是多余的,所以我跳过了数字。我假设您有这样的课程:

    public class OilVolume
    {
        public int Volume { get; set; }
        public string Name { get; set; }
        public OilVolume(string name, int value)
        {
            this.Name = name;
            this.Volume = value;
        }
    
        public override string ToString(){
            return $"{Name} {Volume}";
        }
    }
    

    那么您想要的输出的查询将是:

    var oilSums = db.OilVolumes
      .GroupBy(oil => oil.Name)
      .Select(group => new OilVolume(group.Key,  group.Sum(oil => oil.Volume)))
      .OrderByDescending(oil => oil.Volume);
    

    和输出

    foreach (var oil in oilSums)
     Console.WriteLine(oil);
    

    CP 50
    AB 44
    OB 41
    

    我认为您示例中的 CP 60 是一个错误?

    【讨论】:

    • 嘿,谢谢...实际上我在数据库中有数据。我在哪里有数据。就像 TYPE1 油有 10 行一样,TYPE2 有 5 行等等。想要通过链接获取数据,以便我得到 TYPE1 40 TYPE2 50
    • 好的,您应该可以将我的示例转移到DataRow 上工作您最初的帖子不是很具体。尽管如此,我还是建议将您的数据库数据映射到某种类型的对象,然后使用我在此处提供的方法。
    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2018-03-26
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多