38

我尝试在当前日期选择 60 天 30 天 20 天不同的数据库中的记录。

请在下面查看此查询。

 var uploads = (
                from files in _fileuploadRepository.Table
                join product in _productRepository.Table on files.Event equals product.Id
                where
                    (
                product.EventDate != null &&
                    (product.EventDate.Subtract(DateTime.Now).Days <= 60 && product.EventDate.Subtract(DateTime.Now).Days >= 60) ||
                    (product.EventDate.Subtract(DateTime.Now).Days <= 30 && product.EventDate.Subtract(DateTime.Now).Days >= 30) ||
                    (product.EventDate.Subtract(DateTime.Now).Days <= 20 && product.EventDate.Subtract(DateTime.Now).Days >= 20))
                    &&
                files.IsSkiped == false
                select files;
            ).ToList();

但是这个查询发生了错误。

在此处输入图像描述

我一无所知。请帮忙。

4

4 回答 4

60

您可以使用该EntityFunctions.DiffDays方法

EntityFunctions.DiffDays(product.EventDate, DateTime.Now) //this will return the difference in days

更新

EntityFunctions 现在已过时,因此您应该改用 DBFunctions。

System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now)
于 2013-03-07T06:16:58.517 回答
39

最简单的方法是在执行查询之前计算出边界:

// Only evaluate DateTime.Now once for consistency. You might want DateTime.Today instead.
DateTime now = DateTime.Now;
DateTime nowPlus60Days = now.AddDays(60);
DateTime nowPlus30Days = now.AddDays(30);
DateTime nowPlus20Days = now.AddDays(20);

var query = ...
            where product.EventDate <= nowPlus60Days
            ...

请注意,您当前的查询甚至没有真正意义,因为每个“或”子句都说明给定的计算既小于或等于一个值大于或等于同一值。如果您想要简单的“等于”,请使用它。如果不是,则不清楚您要做什么。

如果您尝试将值存储为“小于 20”、“20-30”、“30-60”、“超过 60”,则需要使用某种形式的分组。

于 2013-03-07T06:16:24.687 回答
5

这应该有效:

using System.Data.Entity.SqlServer;

where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60
于 2017-06-03T09:23:58.630 回答
3

为了补充 Scartag 的答案,

DbFunctions.DiffDays的MSDN 文档没有直接提到 DiffDays() 返回的值是否以及何时为负数,所以我想我会在此处提供该信息:

当参数 1 的日期大于(即相对于)参数 2 的日期时,结果将为负数。

例如,给定一个Deliveries具有非空字段的表,该字段ScheduledDeliveryDate可以具有相对于当前日期的过去和未来的值,此查询将获取当前日期的 2 天内交货日期/时间的所有记录/时间(过去和未来):

DateTime now = DateTime.Now;
var results = from d in Deliveries
    where (DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) < 2
        && DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) > -2)
    select d;
于 2016-01-07T17:41:08.843 回答