从 linq to sql 日期之间 return 结果的正确方法

Correct way to return results from linq to sql between dates

我的查询有点问题。

我有两个日期时间文本框和一个搜索按钮。

当我搜索时,假设从 12/08/2021 到 12/08/2021 它 return 只有一个日期为 2021-08-12 00:00:00.000 的结果,因为时间在其他发票上是 2021-08-12 17:38:55.740

我的代码是:

SearchInvoicesNotSendToMydata(fromDateEdit.DateTime, toDateEdit.DateTime);

public List<Invoices> SearchInvoicesNotSendToMydata(DateTime fromDate, DateTime toDate)
{
    List<Invoices> invoices = db.Invoices
                                .Where(p => (p.Date >= fromDate && p.Date <= toDate));

    return invoices;
}

两个变量都有值

fromDate =12/8/2021 12:00:00

toDate = 12/8/2021 12:43:21

我知道 return 其他发票因为时间的关系,我只是想知道是否有一种优雅的方法来 return 从日期 0:00:00 到23:59:59

*在图像中 Imerominia = 日期

您可以快速完成类似的操作。所以它只会检查和比较日期而不是时间。

public List<Invoices> SearchInvoicesNotSendToMydata(DateTime fromDate, DateTime toDate)
     {
       List<Invoices> invoices = db.Invoices.Where(p => (p.Date.Date >= fromDate.Date && p.Date.Date <= toDate.Date));

       return invoices;
     }

编辑

新信息导致更正

DateTime class return 的 Date 成员是一个新的 DateTime 实例,TimeOfDay 属性设置为 00:00:00。它不是 return 不包含时间信息的新类型。

例如:

DateTime.Now.TimeOfDay      // is 11:26:34.1234567
DateTime.Now.Date.TimeOfDay // is 00:00:00

所以你可以按照@AsifRahman 的回答,或者使用我原来回答的原则来实现你需要的。

@AsifRahman 解决方案基于将 TimeOfDay 属性 设置为 00:00:00 在您将用于比较的所有 DateTime 实例中。这可以通过在所有涉及的 DateTime 个实例上使用 Date 属性 轻松完成。

请注意,此解决方案使用包含的上限 p.Date.Date <= toDate.Date,从清晰度的角度来看,这可能并不理想:后续间隔似乎重叠,但实际上并非如此。

另一个解决方案是使用独占上限并在 toDate.Date 值上增加一天。

SearchInvoicesNotSendToMydata(fromDateEdit.DateTime, toDateEdit.DateTime);

public List<Invoices> SearchInvoicesNotSendToMydata(DateTime fromDate, DateTime toDate)
{
    List<Invoices> invoices = db.Invoices.Where(p => (p.Date >= fromDate.Date && p.Date < toDate.Date.AddDay(1)));

    return invoices;
}

这样做的好处是更加清晰(没有重叠的后续间隔)。

感谢您的回答。 我找到了怎么做。 我只是用 addDays 和 addMilliseonds 以获得正确的日期。 这是任何需要它的人的代码。

    public List<Invoices> SearchInvoicesNotSendToMydata(DateTime fromDate, DateTime toDate)
    {
        List<Invoices> invoices = db.Invoices
                               .Where(p => (p.Date >= fromDate.Date 
                               && p.Date <= toDate.Date.AddDays(1).AddMilliseconds(-1)));
    
        return invoices;
    }