如何在Linq订购日期?

时间:2013-02-22 08:06:50

标签: c# linq entity-framework

我正在使用C#和LINQ,我在类型Date

中有一些日期

目前我正在使用此脚本按开始日期,从早期到最晚来订购列表。

使用以下代码,我的事件未排序:

      events.OrderBy(x => x.DateTimeStart).ToList();    
      return events.AsQueryable();

这里可能有什么问题?

3 个答案:

答案 0 :(得分:12)

events.OrderBy(x => x.DateTimeStart).ToList()会创建一个新列表,但您不会将其返回。

你可能想要像

这样的东西
return events.OrderBy(x => x.DateTimeStart).ToList(); 

答案 1 :(得分:4)

events.OrderBy(x => x.DateTimeStart):声明一个按属性 DateTimeStart 对事件进行排序的查询。查询尚未执行。

events.OrderBy(x => x.DateTimeStart).ToList();:处理上一个查询。迭代所有事件,检查他们的 DateTimeStart ,将它们和安全结果排序为 List ,然后......丢弃结果!因为你不安全。与之类似:

int a = 0;
a + 1;
b = a; // b is 0

return events.AsQueryable();:此处您将返回原始的事件,而不是已排序。

您应该按如下方式编写代码:

return events.OrderBy(x => x.DateTimeStart).ToList().AsQueryable();

该版本将创建已排序事件的静态列表。如果现在您更改了事件列表,则结果将不会考虑您的更改。

第二个解决方案是:

return events.OrderBy(x => x.DateTimeStart).AsQueryable();

该版本不起作用。它只是声明了一种排序事件的方式,并将该方式返回为 IQueryable 。如果您在将来的代码中使用返回值,它将始终包含所有已排序的事件,即使您在使用之前添加了新事件。

答案 2 :(得分:2)

将orderedevents存储在变量中并返回此变量asQueryable();

var orderedEvents = events.OrderBy(x => x.DateTimeStart).ToList();    

return orderedEvents.AsQueryable();

或者如果您不需要该变量,则直接返回您订购的事件。

return events.OrderBy(x => x.DateTimeStart).ToList().AsQueryable();