按匿名类型的字段排序

问题描述 投票:1回答:3

我正在使用LINQ来聚合对象:

  var summary = from esc in objs
                where esc.time.Month == month && esc.time.Year == year
                group esc by esc.rlf_id into g
                select new { 
                  ID = g.Key, 
                  Total = g.Count(), 
                  Preventable = g.Where(a => a.preventable).Count() 
                };

我的查询按预期工作,但我也想通过匿名类型中的任意字段对查询进行排序。我找到了LINQ: Order By Anonymous Type,但它在VB.NET中,需要强烈指定要排序的字段。我可以将此伪代码概念化:

query = get all esc in obj
        aggregate into anonymous type with key ID
          ID = g.Key, Total = g.Count, Preventable = g.Count of preventable
        orderby inputField[0], (optional thenby inputField[1], ..., thenby inputField[n])

我如何完成:

  • 在LINQ查询中按匿名类型的字段排序] >> [[(完成-谢谢Marko!)按匿名类型的任意字段进一步排序
  • 我愿意接受点语法或查询语法。

编辑:有了Marko Stanojevic的回答,我就能部分满足我的要求。我没有意识到我能够像这样将LINQ方法链接在一起。我现在可以(并从中获得预期的结果):

var summary = from esc in objs where esc.time.Month == month && esc.time.Year == year group esc by esc.rlf_id into g select new { ID = g.Key, Total = g.Count(), Preventable = g.Where(a => a.preventable).Count() }; summary = summary.OrderBy(e => e.Total);

我需要让我做的事情:(伪代码)

summary = summary.<Order/Then>By<(optional)Descending>(e => e.<someUserInput>)

给出一些指定用户希望如何排序的字符串,显然我可以做到:

if (sortQuery.Equals("Total", StringComparison.OrdinalIgnoresCase), bool descending) { summary = descending ? summary.OrderByDescending(e => e.Total) : summary.OrderBy(e => e.total) } else if (sortQuery.Equals( /* ... etc */

但是,这最终变得很丑陋,尤其是因为我想将其用于(可能几乎无限)不断增长的查询数量。还需要考虑OrderBy()ThenBy()

我希望我正在使用C#4,以便现在就可以使用动态...

我正在使用LINQ to Objects进行汇总:var summary =来自obj中的esc,其中esc.time.Month == month && esc.time.Year == year esc by esc.rlf_id到...

c# linq c#-3.0 linq-to-objects
3个回答
0
投票
数据类型为匿名的事实并不重要,也不会改变问题。匿名类型是另一种类型(它只有一个特殊名称)。与其他类型一样,它在编译时是完全已知的!您可以阅读Anonymous Type vs Dynamic Type,以了解有关匿名和动态类型之间区别的更多信息。

困难在于仅在运行时知道要调用的方法(例如OrderByOrderByDescending)及其参数(例如keySelector item => item.MyFieldName)。>

解决方案是使用反射


6
投票
我不确定是什么问题。计算摘要后,您可以简单地

summary = summary.OrderBy(s => s.Total).ToList();


0
投票
您可以使用以下extensions

尝试一下:

© www.soinside.com 2019 - 2024. All rights reserved.