C# LINQ中的数据差逻辑

C# LINQ中的数据差逻辑,c#,mysql,sql,linq,entity-framework,C#,Mysql,Sql,Linq,Entity Framework,我试图从两个不同的数据库表访问数据,然后使用C中的LINQ在两个字段上将它们连接在一起。我相信我有一个逻辑上合理的整体工作方法。我遇到的部分问题是,在连接两个表之前,我会过滤这两个表中的数据,因为这两个表的数据太多,这会导致崩溃 主要问题是,对于其中一个表,我只需要提取时间戳列值为today的数据。时间戳值的类型为System.DateTime 我尝试了几种不同的方法: DateTime? currentDate = System.DateTime.Now; v

我试图从两个不同的数据库表访问数据,然后使用C中的LINQ在两个字段上将它们连接在一起。我相信我有一个逻辑上合理的整体工作方法。我遇到的部分问题是,在连接两个表之前,我会过滤这两个表中的数据,因为这两个表的数据太多,这会导致崩溃

主要问题是,对于其中一个表,我只需要提取时间戳列值为today的数据。时间戳值的类型为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不存在}”

        var second_data = (from b in this.database.table
            where b => b.timeStamp.Value.Date == DateTime.Now.Date
            select b);
这不起作用,因为LINQ to实体中不支持“指定类型成员”Date。仅支持初始值设定项、实体成员和实体导航属性。”

        var second_data =
            this.database.table.Where(sd => sd.timeStamp.Value.Date == DateTime.Now.Date);
但由于使用了.Date,此操作再次失败


不幸的是,因为我没有内存来保存所有数据,所以不可能先提取所有数据,然后在其上运行日期逻辑。如果有人能告诉我如何解决这个问题,我将不胜感激。我正在使用Sql Server,如果我删除对timestamp.Value的调用,我将使用您的第一个方法。我认为您的版本无法编译,因为DiffDays对这两个参数都需要可为空的日期时间

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从表中获取仅适用于今天或特定日期范围的行,您可以简单地执行此操作。这种方法的优点在于,它适用于特定日期或日期范围的两种情况

//指定没有时间的日期范围 DateTime currentDate=System.DateTime.Now.Date; DateTime nextDate=currentDate.AddDays1; var second_data=来自this.database.table中的b 其中b.timeStamp.Value>=当前日期 和b.timeStamp.Value这个答案帮助我确定了确切的天数,而不是两者之间的差异:

找到它了吗

这是一个示例,展示了一种让所有员工在现在和14天之后都拥有DOB的方法

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
);
…尽管如此,请注意这样的查询将进行表扫描,但不能使用任何索引

如果只是在列引用中使用Date失败,也许您可以尝试sd.timeStamp.Value>=DateTime.Now.Date&&sd.timeStamp.Valueb.timeStamp.Value==DateTime。现在选择b;var second_data=this.database.table.Wheresd=>sd.timeStamp.Value==DateTime.Now;不幸的是,DiffDays仍然不起作用,并且Value没有去掉导致等价性检查无法正常工作的时间。很抱歉读到这一点。很遗憾,我无法测试您的条件。我目前没有DbFunctions,我可能会研究一下是否可以得到它。至于使用EntityFunctions.DiffDays,我得到一个错误,说{FUNCTION database.DiffDays不存在}Mike Peterson的技术很简单,不依赖于数据库函数,所以我同意这一点。但我也认为保持EF的最新状态将是一项很好的投资。还有一个技巧:警告:我没有使用MySQL的经验,不敢相信我没有想到这样的方法。谢谢你的答案有资格获得100票以上的单人票。但不幸的是,stackoverflow限制了我的投票权。回答得很好。非常感谢。
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