LINQ(动态):使用动态linq在GroupBy中的OrderBy?

时间:2011-09-29 11:49:05

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

我使用普通的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”中的项目都没有订购。

我有点失落。

任何帮助真的很感激..

1 个答案:

答案 0 :(得分:1)

这是一个很好的问题!

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

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

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

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个查询的最大区别在于执行订单。在第一个查询中,当您在groupedItems.OrderBy(x => x.Name)或单个条目上执行IGrouping<DateTime,Item>时,它会遍历所有分组。

在第二个查询中,orderby正在执行之后执行。这意味着您正在IEnumerable<IGrouping<DateTime,Item>>上进行排序,因为迭代已经发生。

由于微软很好,他们添加了一些东西来帮助解决这个问题。 This overload允许您指定在迭代集合时返回的项目。以下是代码示例:

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

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

希望这有帮助!