【问题标题】:LINQ (Dynamic): OrderBy within a GroupBy using dynamic linq?LINQ(动态):GroupBy 中的 OrderBy 使用动态 linq?
【发布时间】:2011-09-29 11:49:04
【问题描述】:

我使用普通 linq 进行了以下查询,并且效果很好(使用匿名类型),

     var result = from s in Items
            group s by s.StartTime into groupedItems
            select new {groupedItems.Key, Items= groupedItems.OrderBy(x => x.Name) };

但使用 Dynamic Linq 我无法在 groupby 中对其进行排序。

     result = Items.GroupBy("StartTime", "it").OrderBy("Name");

它表明名称不可用。值得注意的是,如果我关闭 OrderBy,一切正常,但每个“Key”中的项目都没有排序。

【问题讨论】:

    标签: linq linq-to-objects dynamic-linq


    【解决方案1】:

    这是个好问题!

    我通过创建一个名为 Item 的类来模拟您的情况。

    public class Item
    {
        public DateTime StartTime { get; set; }
        public string Name { get; set; }
    }
    

    然后创建一个基本的项目列表来进行分组。

    List<Item> Items = new List<Item>()
    {
        new Item() { StartTime = DateTime.Today, Name = "item2"},
        new Item() { StartTime = DateTime.Today, Name = "item1"},
        new Item() { StartTime = DateTime.Today.AddDays(-1), Name = "item3"},
    };
    

    现在 2 个查询的最大区别在于执行 order by 的位置。在第一个查询中,当您执行 groupedItems.OrderBy(x =&gt; x.Name) 时,它会在 IGrouping&lt;DateTime,Item&gt; 或单个条目上执行,因为它会遍历所有分组。

    在第二个查询中,orderby 是在事后执行的。这意味着您正在对IEnumerable&lt;IGrouping&lt;DateTime,Item&gt;&gt; 进行排序,因为迭代已经发生。

    由于微软很好,他们添加了一些东西来帮助处理表达式。 This overload 允许您指定在遍历集合时返回的项目。下面是代码示例:

    var expressionResult = Items.GroupBy(x => x.StartTime, 
    (key, grpItems) => new { key, Items = grpItems.OrderBy(y => y.Name) });
    

    GroupBy 的第二部分您可以指定一个 lambda 表达式,该表达式接受一个键和该键下的一组项目并返回您指定的条目,这与您在原始查询中所做的相同。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多