我目前正在使用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)
答案 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.
}