【问题标题】:LINQ query to calculate values from joined collectionLINQ 查询以计算联接集合中的值
【发布时间】:2017-04-26 12:26:00
【问题描述】:

我不熟悉使用 LINQ 加入集合和执行计算。我有以下查询,它连接了由 StationId 连接的 RailwayStation 对象和 ExpenditureData 对象的集合。

var joinedData = (from s in stations join e in expenditureData on s.stationId 
equals e.StationId select s).Distinct();

我需要什么 LINQ 才能从我创建的 joinedData 集合中获得最高支出金额(它是支出数据中的一个属性)的前 10 个站点?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    我正在尝试按 StationCargoCode(在 Station 对象)获取前 10 个 StationCargoCodes 最高的 支出数据,并获得总支出数据。

    您可以尝试以下查询:

    var joinedData = (from s in stations 
                      join e in expenditureData 
                      on s.stationId equals e.StationId 
                      group by s.StationCargoCode into gr
                      select new 
                      {
                          StationCargoCode = gr.Key,
                          TotalExpenditureAmount = gr.Sum(ed=>ed.expenditureAmount)
                      }).OrderByDescending(sc=>sc.TotalExpenditureAmountExpenditureAmount)
                        .Take(10);
    

    最初,我们根据车站 ID 加入我们的数据。

    然后我们根据 StationCargoCode 对加入的结果进行分组。

    分组后,我们将每个组投影到一个具有两个值的匿名对象,一个是用于分组的键,另一个是该键的支出金额之和。

    最后,我们根据TotalExpenditureAmount 按降序排列我们的结果,然后我们选择前 10 个。

    【讨论】:

    • 请OP,注意这个答案的缩进。让阅读变得轻松 10 倍。
    • 但是如果一个站有多个最大值会发生什么,我认为你的解决方案中可能有重复站
    • 可能只需要先申请 .Disctinct 然后 Apply Orderby 最后 .Take(10)
    • var joinedData = (from s in stations join e in expenditureData on s.stationId equals e.StationId orderby e.expenditureAmount descending select s).Distinct().Take(10);
    • @christos 感谢您的回复。我正在尝试按 StationCargoCode(Station 对象中的属性)对数据进行分组,以获取支出数据最高的前 10 个 StationCargoCodes 并获得总支出数据。我尝试了以下方法,但语法不正确:(from s in stations join e in expenditureData on s.stationId equals e.StationId orderby e.expenditureAmount descending select s).Sum(e => e.expenditureData).GroupBy(n => n.expenditureAmount).Take(10);
    【解决方案2】:

    你可以试试这个:

    var joinedData = (from s in stations 
                      join e in expenditureData on s.stationId equals e.StationId into g
                      select new{s,g})
                      .OrderByDescending(v=>v.g.Max(r=>r.expenditureAmount))
                      .Take(10)
                      .Select(v=>v.s);
    

    更新

    var joinedData = (from s in stations 
                      join e in expenditureData on s.stationId equals e.StationId into g
                      select new{s.StationCargoCodes ,Max=g.Max(r=>r.expenditureAmount)})
                      .OrderByDescending(v=>v.Max)
                      .Take(10);
    

    如果您只想要StationCargoCodes,然后在末尾添加Select 调用,如下所示:

    .Select(e=>e.StationCargoCodes);
    

    【讨论】:

    • 感谢您的回复,这确实有效,但我认为我需要以某种方式添加一个组,以按 StationCargoCodes(Station 对象中的一个属性)进行分组。如何从加入的数据集合中获得支出金额最高的前 10 个 StationCargoCode。
    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多