如何编写linq以获取最新的传入事件记录

时间:2011-01-22 05:28:32

标签: c# linq entity-framework

var events = context.Events .........

事件的属性'DueDate'(日期时间)

我想选择最近的5条记录,如何编写这样的查询?感谢

2 个答案:

答案 0 :(得分:3)

如果您对最接近白天的活动感兴趣,可以这样做:

DateTime today = DateTime.Now;
var events = context.Events
                    .OrderBy(e => Math.Abs((today - e.DueDate).Days))
                    .Take(5)
                    .ToList();

这将采用距离今天(过去或将来)最少天数的事件。

如果您想要最近但仅限于将来的活动,您可以这样做:

DateTime today = DateTime.Now;
var events = context.Events
                    .Where(e => e.DueDate >= today)
                    .OrderBy(e => (e.DueDate - today).Days)
                    .Take(5)
                    .ToList();

修改

如果您使用LINQ to Entities DateTime操作不是直接支持的,但是如果您使用SQL服务器,DateDiff之类的东西应该可以工作(未经测试,您将不得不亲自尝试):

DateTime today = DateTime.Now;
var events = context.Events
                    .Where(e => e.DueDate >= today)
                    .OrderBy(e => System.Data.Objects.SqlClient.SqlFunctions.DateDiff("d", e.DueDate, today))
                    .Take(5)
                    .ToList();

如果这不起作用,您可以始终先获取数据,然后使用LINQ过滤到对象,这样可以增加您不会将自己绑定到SQL Server的好处 - 但显然效率不高:

DateTime today = DateTime.Now;
var futureEvents = context.Events
                          .Where(e => e.DueDate >= today);
                          .ToList();   

var filteredEvent = futureEvents 
                    .OrderBy(e => (e.DueDate - today).Days)
                    .Take(5)
                    .ToList();

答案 1 :(得分:1)

写一种方法:

var events = context.Events.OrderByDescending(e=>e.DueDate).Take(5);