【问题标题】:Using LINQ to search between two Dates and Times使用 LINQ 在两个日期和时间之间进行搜索
【发布时间】:2014-08-22 18:49:17
【问题描述】:

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

基本上,用户使用可选的时间参数选择开始和结束日期。例如,用户选择从 2014 年 1 月 1 日上午 11 点到 2014 年 1 月 3 日下午 3 点的开始日期。问题是由于搜索分两个阶段,它将搜索开始日期和结束日期之间的所有行。然后 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)

【问题讨论】:

  • 对不起,我不明白你要完成什么?
  • 你的代码有什么问题?
  • A_TimestartTimeendTime的类型有哪些?
  • 不相关,但你可能想要OrderBy(...).OrderBy(...)而不是OrderBy(...).ThenBy(...)
  • 您可能应该将这些Where&amp;&amp; 合二为一,并使用OrderBy(...).ThenBy(...) 进行订购。

标签: c# sql linq


【解决方案1】:

你可以使用这样的逻辑:

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

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

【讨论】:

  • 谢谢!这对我帮助很大。我只是无法绕过它。感谢凯尔的帮助。
  • 该死的,这真是聪明的解决方案!
  • 我假设你会在结束日期时间做同样的事情?
  • @jwatts1980 它会使用小于,但逻辑会非常相似,是的。
  • 是的@Abhinav 我自己正在编写一些组合代码.. 但我更喜欢这个
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2015-07-01
    • 1970-01-01
    相关资源
    最近更新 更多