使用LINQ在两个日期和时间之间搜索

本文关键字:日期 时间 之间 搜索 两个 LINQ 使用 | 更新日期: 2023-09-27 18:19:13

我目前正在使用两种方法进行搜索。我运行一个存储过程,提取两个日期之间的信息。然后在这些结果中进行LINQ搜索。

基本上用户选择一个开始和结束日期与可选的时间参数。例如,用户选择的开始日期为01/01/2014 11am至01/03/2014 3pm。问题是,因为搜索是在2个阶段,它将搜索开始和结束日期之间的所有行。然后,LINQ搜索这些时间,但将其限制在每天上午11点到下午3点之间。

由于某种原因,我似乎不知道如何解决这个问题。这是代码如何在我的应用程序中…

var model = db.Results(startDate, endDate)
            .Where(r => startTime == null || r.A_Time >= startTime)
            .Where(r => endTime == null || r.A_Time <= endTime)
            .OrderBy(r => r.A_Time)
            .OrderBy(r => r.A_Date)
            .Take(1000)
);

数据库结构如下:

TABLE [dbo].[TablewithInfo](
    [A_Date] [date] NOT NULL,
    [A_Time] [time](7) NOT NULL,
    [Site] [varchar](50) NOT NULL,
    [Event] [varchar](50) NULL,
    [Client] [varchar](25) NOT NULL,
    [User] [varchar](50) NULL,
    [Host] [varchar](50) NOT NULL,
    [Info] [varchar](2800) NOT NULL)

使用LINQ在两个日期和时间之间搜索

您可以这样使用逻辑:

.Where(row => startTime == null || row.A_Date > startDate || (row.A_Date == startDate && row.A_Time >= startTime))

所以要么没有指定时间,日期在当前日期之后(时间无关紧要),要么是相同的日期,时间在后面。

下面的查询是多余的,但是必要的:

var sdt = CombineParameters(startDate, startTime);
var edt = CombineParameters(endDate, endTime);
var model = db.Results(startDate, endDate)
            .Where(r => (CombineParameters(r.A_Date, r.A_Time) >= sdt))
            .Where(r => (CombineParameters(r.A_Date, r.A_Time) <= edt))
            .OrderBy(r => r.A_Time)
            .OrderBy(r => r.A_Date)
            .Take(1000)
);

// Date and Time classes below are only examples, they do not exist
// Prolly you are using string ;)
private DateTime CombineParameters(Date dt, Time tt)
{
    // some way to combine dt and tt to DateTime
    // you might have to do NULL checks here etc.
}