在LINQ中的日期差逻辑

3
我正在尝试使用C#的LINQ从两个不同的数据库表中访问数据,然后在两个字段上将它们连接起来。我相信我已经有一个逻辑上正确的整体工作方法。我遇到的部分问题是,在将它们连接起来之前,我需要过滤掉来自两个表的数据,因为这些表的数据太多了,会导致崩溃。

主要问题是我需要从其中一个表中仅获取今天时间戳(列)值的数据。时间戳值的类型为System.DateTime?。

我已经尝试了几种不同的方法:

        DateTime? currentDate = System.DateTime.Now;

        var second_data = (from b in this.database.table
            where EntityFunctions.DiffDays(b.timeStamp.Value, currentDate) == 0
            select b);

我认为这不起作用是因为数据库中没有处理它的函数。内部异常:'{"FUNCTION database.DiffDays does not exist"}'

        var second_data = (from b in this.database.table
            where b => b.timeStamp.Value.Date == DateTime.Now.Date
            select b);

这个不起作用是因为“指定的类型成员'Date'在LINQ to Entities中不受支持。只支持初始化程序、实体成员和实体导航属性。”

        var second_data =
            this.database.table.Where(sd => sd.timeStamp.Value.Date == DateTime.Now.Date);

但是由于使用了.Date,这种方法仍然失败了。

不幸的是,因为我没有足够的内存来保存所有数据,所以先获取所有数据,然后再运行日期逻辑的可能性是不可能的。如果有人能提供任何关于如何解决这个问题的见解,那将不胜感激。谢谢。


如果仅在列引用上使用“Date”失败,也许您可以尝试 sd.timeStamp.Value >= DateTime.Now.Date && sd.timeStamp.Value < DateTime.Now.AddDays(1).Date? - undefined
我很欣赏这个想法,但是在查询代码中,即使是对于DateTime.Now,使用.Date也是不支持的。 - undefined
似乎对于可空的DateTime类型,Value属性相当于整个非可空的DateTime变量,也就是说,你的代码应该修正为:EntityFunctions.DiffDays(b.timeStamp.Value, currentDate.Value)var second_data = (from b in this.database.table where b => b.timeStamp.Value == DateTime.Now select b);,以及var second_data = this.database.table.Where(sd => sd.timeStamp.Value == DateTime.Now); - undefined
很遗憾,DiffDays仍然无法正常工作,而且Value没有剥离时间,导致等值检查无法正确进行。 - undefined
很抱歉阅读到这一点。不幸的是,我无法测试您的条件。 - undefined
明白了,无论如何都感激。我获取日期而不仅仅是值的原因是因为等价性检查会使用整个时间戳。 - undefined
4个回答

12

要获取仅为今天(或特定日期范围)的表中的行,您可以简单地执行此操作。这种方法的好处是它适用于特定日期或日期范围的两种情况。

// specify date range (without time)    
DateTime currentDate = System.DateTime.Now.Date;
DateTime nextDate = currentDate.AddDays(1);

var second_data = from b in this.database.table 
                  where b.timeStamp.Value >= currentDate 
                  and b.timeStamp.Value < nextDate
                  select b;

真不敢相信我竟然没想到这样的方法。谢谢! - undefined
您的回答有资格被单个人投票100次。但不幸的是,stackoverflow只允许我投一票。非常好的回答。谢谢。 - undefined

4
query = query.Where(c=>  DbFunctions.DiffDays(c.ToDate, DateTime.Now) < 30);

在我的情况下它无法工作


2

我正在使用Sql Server,如果我删除对timestamp.Value的调用,则可以使用您的第一种方法。我认为您的版本没有编译成功,因为DiffDays接受两个可空的DateTime参数。

DateTime? currentDate = System.DateTime.Now;

var second_data = (from b in this.database.table
    where EntityFunctions.DiffDays(b.timeStamp, currentDate) == 0
    select b);

我注意到的另一件事是,我收到了一个警告:

'System.Data.Entity.Core.Objects.EntityFunctions'已过时:'此类已被System.Data.Entity.DbFunctions取代。'

所以,如果在MySql中仍然无法正常工作,您可以尝试使用DbFunctions

我目前没有DbFunctions,我可能会看看能否获取它。至于使用EntityFunctions.DiffDays,我得到一个错误,显示{"FUNCTION database.DiffDays does not exist"}。 - undefined
Mike Peterson的技术很简单,不依赖于数据库函数,所以我会选择这个。但我也认为保持EF更新是一个不错的投资。还有这个技术:https://dev59.com/2FrUa4cB1Zd3GeqPhCIB#8500699(注意:我对MySql没有经验) - undefined

0

这个答案对我在编程中遇到的确切日期问题非常有帮助,而不是计算日期之间的差异:

forums.asp.net上找到了它。

下面是一个示例,展示了一种获取所有生日在现在和未来14天之间的员工的方法...

var employeesWithBirthday = 
    from emp in dc.Employees
    let BirthdayDiff = (new DateTime(DateTime.Now.Year, emp.BirthDate.Month, emp.BirthDate.Day) - DateTime.Now).TotalDays 
    where BirthdayDiff >= 0 && BirthdayDiff <= 14
    select emp

虽然如此,请注意这样的查询将进行全表扫描(无法使用任何索引)...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接