LINQ lambda orderbydownon group by key.count()返回用于图表图例排序的gro

本文关键字:用于 排序 gro 返回 group orderbydownon lambda by key count LINQ | 更新日期: 2023-09-27 18:07:27

尝试在MVC 4 c#中排序饼状图的图例。该图表根据产品编号显示售出的产品数量。在图例中,我想显示商品编号,然后是销售数量,然后是销售百分比,并按销售数量降序排列。

我已经让"Y"值(# sold)正确排序,但在试图排序"X"值时,它们最终混乱,不匹配正确的"Y"值。

在我看来,我应该只需要按项目编号分组数据,然后按匿名类型的项目编号和项目编号计数选择数据,然后根据项目编号计数降序排序,然后再次选择这次只以正确顺序获取项目编号的列表字符串。

有一个合理的机会,上面的工作很好,问题更多地在于我几乎完全缺乏对DataBindXY方法如何在图表中工作的理解。

代码:

var data = srv.GetTSMMetricData(Mode, Territories, selectedTerritory).GroupBy(x => x.ItemNumber).ToList();
var xValues = data.Select(x => x.Key).OrderByDescending(x => x.Count()).ToList();
mySeries.Points.DataBindXY(xValues, data.Select(x => x.Count()).OrderByDescending(x => x).ToList());

任何在正确方向上的帮助或推动都会很棒。如果还有什么我可以贴出来的可能缺失的东西,请告诉我。

谢谢。

编辑:忘了我在上面代码的前一个版本中试图使用匿名类型..

var xValues = data.Select(x => new { Item = x.Key, Count = x.Key.Count() }).OrderByDescending(x => x.Count).ToList();
mySeries.Points.DataBindXY(xValues.Select(x => x.Item).ToList(), data.Select(x => x.Count()).OrderByDescending(x => x).ToList());

编辑2:当前结果示例(前5个图例条目)..

ItemNumber - # Sold - % Sold ----- Correct ItemNumber for # Sold
-------------------------------------------------------------
8500         42       (20.79)%     PRS
JOL          19       (9.41)%      JOL
280          18       (8.91)%      ENV
171          13       (6.44)%      AMR
172          12       (5.94)%      GRD
Note: 38 rows of total results

结果包含查询的所有正确的ItemNumbers和所有的# Sold,但是ItemNumbers与正确的# Sold不匹配。我可以重写代码,使ItemNumbers和# Sold匹配,但只按ItemNumber排序,而我真的想按# Sold排序。希望这能让你更清楚问题是什么,以及我希望看到发生什么。

LINQ lambda orderbydownon group by key.count()返回用于图表图例排序的gro

我认为排序两次会混淆键和值的顺序。

确保您首先创建了一个正确排序的pair列表:

var data = srv.GetTSMMetricData(Mode, Territories, selectedTerritory)
           .GroupBy(x => x.ItemNumber)
           .Select( x => new
                        {
                            ItemNumber = x.Key,
                            Count = x.Count()
                        } )
           .OrderByDescending(x => x.Count)
           .ToList();

然后执行绑定:

mySeries.Points.DataBindXY(data.Select(x => x.ItemNumber)
                          ,data.Select(x => x.Count));

GroupBy返回IEnumerable<IGrouping<TKey,TEntity>

计算每组中对象的个数:

srv.GetTSMMetricData(Mode, Territories, selectedTerritory)
    .GroupBy(x => x.ItemNumber)
    .Select( x => new
        {
            ItemNumber = x.Key,
            Count = x.Count()
        } );