我使用普通的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,一切都会很好,但是每个“键”中的项目都不会排序。
这是一个好问题!
我通过创建一个名为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"},
};
现在,这两个查询的最大区别在于执行命令的位置。在第一个查询中,当您执行groupedItems.OrderBy(x => x.Name)
时,它会在IGrouping<DateTime,Item>
或单个条目上执行,因为它会遍历所有分组。
在第二个查询中,事实之后正在执行orderby。这意味着您正在对IEnumerable<IGrouping<DateTime,Item>>
进行排序,因为迭代已经发生。
由于Microsoft很好,他们添加了一些内容来帮助处理表达式。 This overload允许您指定在迭代集合时返回的项目。这是代码示例:
var expressionResult = Items.GroupBy(x => x.StartTime,
(key, grpItems) => new { key, Items = grpItems.OrderBy(y => y.Name) });
GroupBy的第二部分,您可以指定一个lambda表达式,该表达式需要一个键和该键下的一组项目,并返回您指定的条目,这与您在原始查询中所做的相同。
希望这会有所帮助!