繁体   English   中英

LINQ查询以从联接的集合中计算值

[英]LINQ query to calculate values from joined collection

我是第一次使用LINQ来加入集合和执行计算。 我有以下查询它连接火车站有对象的集合和ExpenditureData对象通过的stationID加入。

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

从我创建的joinedData集合中,我需要什么LINQ来获得前10个站,这些站的前十年支出最高(支出数据中的属性)?

我正在尝试按StationCargoCode(Station对象中的一个属性)对数据进行分组,以获取支出数据最高的前10个StationCargoCode,并获取总支出数据。

您可以尝试以下查询:

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对加入的结果进行分组。

分组后,我们将每个组投影到一个具有两个值的匿名对象,一个值用于分组的键,另一个值用于该键的expenseAmount的总和。

最后,我们基于TotalExpenditureAmount以降序对结果进行排序,然后选择前10个。

您可以尝试以下方法:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM