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

时间:2014-08-22 18:49:17

标签: c# sql linq

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

基本上,用户使用可选的时间参数选择开始日期和结束日期。例如,用户选择开始日期01/01/2014 11am到01/03/2014 3pm。问题是因为搜索分为两个阶段,它将搜索开始日期和结束日期之间的所有行。然后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)
);

根据要求,db结构如下。

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)

2 个答案:

答案 0 :(得分:4)

你可以使用这样的逻辑:

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

因此,无论是否指定时间,日期都在当前日期之后(时间不重要),或者它是相同的日期,时间是晚些时间。

答案 1 :(得分:1)

以下查询正在做什么,这是多余但必要的:

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.
}