如何对包含动态对象的列表进行排序

7

我有一个包含动态类型对象的列表。当我使用LINQ的OrderBy方法时,会出现错误提示“对象”不包含“日期”的定义。我该怎么做才能按照日期对我的列表进行排序呢?

List<dynamic> employees = new List<dynamic>();

employees.Add(new
{
    ID = 1,
    Name = "Larry",
    Date = new DateTime(2010, 10, 1),
});

employees.Add(new
{
    ID = 2,
    Name = "Clint",
    Date = new DateTime(2011, 5, 28),
});

employees.Add(new
{
    ID = 3,
    Name = "Jason",
    Date = new DateTime(2011, 7, 6),
});

var query = employees.OrderBy(x => x.Date);

你是说 lambda 表达式不支持动态类型吗? - zmbq
在 LinqPad 中执行并且运行良好。 - okrumnow
2个回答

6

你展示的代码是否在同一程序集中?

匿名类型无法跨程序集使用,“对象不包含此定义”错误通常是在两个不同程序集中使用匿名类型的典型迹象

(例如,在 ASP.net MVC 页面中,控制器可能返回一个匿名类型作为模型,视图可能尝试使用它=> 出现了完全相同的错误)


实际上,代码在另一个程序集中。我发布的代码只是一个示例。因为知道它不能跨程序集工作,所以我修改了创建动态对象列表并按日期排序的代码,然后将排序后的列表传递给使用该程序集的代码。感谢您提供的信息! - Halcyon
@Halcyon 很好。问题在于匿名类型是内部的。有一些技巧可以将它们包装在动态中,使它们可以跨程序集工作,但确实更好的解决方案是重新设计架构。 - Michael Stum

3

我验证了您的查询在.NET 4.0中可行。您的程序集是否缺少对Microsoft.CSharp的引用?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接