Vb.net 在以前的查询中,不能选择日期信息

Vb.net 在以前的查询中,不能选择日期信息,vb.net,linq,entity-framework,datetime,Vb.net,Linq,Entity Framework,Datetime,我想显示从现在到下一天过生日的员工的信息 这是我的疑问。带有_dayrm的函数是参数 Dim query = (From emp In Context.UNI_EMPLOYEE_CV.ToList Select New RemindDTO With { .EMPLOYEE_CODE = emp.UNI_EMPLOYEE.EMPLOYEE_CODE,

我想显示从现在到下一天过生日的员工的信息

这是我的疑问。带有_dayrm的函数是参数

Dim query = (From emp In Context.UNI_EMPLOYEE_CV.ToList
                         Select New RemindDTO With {
                             .EMPLOYEE_CODE = emp.UNI_EMPLOYEE.EMPLOYEE_CODE,
                             .FULLNAME = emp.UNI_EMPLOYEE.FULLNAME,
                             .REMIND_DATE = emp.BIRTHDATE}).ToList.Distinct

Dim result = (From emp In query
                             Where emp.REMIND_DATE IsNot Nothing AndAlso
                             ((DateTime.Now >= New Date(DateTime.Now.Year, emp.REMIND_DATE.Value.Month, emp.REMIND_DATE.Value.Day).AddDays(-_dayrm)) And
                             (DateTime.Now <= New Date(DateTime.Now.Year, emp.REMIND_DATE.Value.Month, emp.REMIND_DATE.Value.Day)))
                             Select emp)

Return result.ToList()
Dim query=(来自Context.UNI\u EMPLOYEE\u CV.ToList中的emp
选择“新建提醒”以使用{
.EMPLOYEE_CODE=emp.UNI_EMPLOYEE.EMPLOYEE_CODE,
.FULLNAME=emp.UNI_EMPLOYEE.FULLNAME,
.empline_DATE=emp.BIRTHDATE}).ToList.Distinct
Dim结果=(来自查询中的emp
在那里,emp.REMIND_日期不是空的,也是空的
((DateTime.Now>=新日期(DateTime.Now.Year,emp.emp.emp\u Date.Value.Month,emp.emp.emp.emp\u Date.Value.Day)。AddDays(-u dayrm))和

(DateTime.NowOracle DateTime格式不同。使用to_date函数以所需格式传递它,然后在查询中使用它进行操作。

首先,您需要考虑数据库将如何处理此操作。在您当前的代码中,因为您正在第一行末尾调用
ToList
,对数据库进行的唯一查询如下所示:

从统一员工简历中选择*
接下来的所有操作都在内存中完成。换句话说,您正在检索整个表

那么,您应该在数据库上执行什么查询呢?嗯,这有点棘手。为了获得良好的性能,所有查询都应该能够使用索引。否则,它们必须扫描整个表。一般来说,任何时候您编写查询时,都必须在比较之前修改数据库中的字段,这是一个必须执行的查询扫描表的每一行。在某些情况下,它可能扫描索引的每一行,但这也不好。您需要的是搜索,而不是扫描

所以退一步想想你在做什么。你想查询所有生日属于某一特定范围的员工。但由于今年是他们的生日,你没有可以创建索引的列。每一行的数据都必须根据当前年份进行调整

我们对此进行了详细讨论。我认为最好的解决方案是。基本上,您需要创建一个附加列,并在其中填充年份固定为2000年的数据。然后您需要为该列编制索引。(我不是Oracle专家,但我相信,如果不能更改表架构,也可以使用物化视图上的索引来实现这一点。在SQL Server中,可以使用索引视图。)

假设您已经这样做了,现在数据库中有一个名为
生日\u Y2K
的列。现在您可以这样做:

Dim today As DateTime=DateTime.today
Dim startDate As DateTime=新日期时间(2000年,今天.月,今天.年)
Dim endDate As DateTime=startDate.AddDays(\u dayrm)
如果endDate.Year=2000,则
Dim查询=(来自Context.UNI_EMPLOYEE_CV中的emp
其中emp.birth\u Y2K>=起始日期
emp.Birth_Y2K=起始日期

或者emp.birth\u Y2K我不知道为什么要混合DateTime.Now(year)和emp.emp.emild\u DATE.Value(month和day)来创建日期,但是emp.emild\u DATE.Value部分似乎完全没有值(例如:0或13表示月份)。检查您的输入数据。提醒_DATE是一种日期类型,因此我认为它不能像您在示例中提到的那样是13个月……这就是您所指的错误所指示的(这两个值中的一个必须是错误的;DateTime.Now.Year应该是正确的)。有许多原因可能会导致该值错误,例如:您正在考虑不同的区域设置;2000年1月13日对我们来说是可以接受的(月/日),但在相当多的欧洲国家(日/月)。问题显然存在于输入中,您的代码没有提供任何关于这方面的提示,因此很难知道发生了什么。我知道您的意思,但当我调试并观察DateTime.Now.Year的值时,它准确地显示了2013年,但没有值显示在emp.membrand_DATE.value.Month和DATE中,而fir的结果st查询是“Dim查询”在Oracle的数据库中准确显示了emp\u DATE的值。您没有澄清任何内容。DateTime.Now可以肯定,而且在任何情况下都是常量。在查询过程中使用不同值的变量是emp.emp\u DATE.value.Month和emp.emp\u DATE.value.Day,您应该通过查看原始数据中的值来检查这些变量l DB或创建一个新查询,仅用于调试,将所有值写入文本文件或类似文件。如果您不提供有关输入条件的进一步信息(即emp.emplind_DATE.Month和emp.emplind_DATE.Day使用的所有值),我们无法帮助您。与什么不同?这是一个.NET错误,当您打算从错误的数字(例如0-13-0001)生成日期时触发。OP的代码不是传递Oracle日期,而是使用其中的一些整数(天、月).你能详细解释一下你的意思吗?你的陈述会有什么帮助?非常感谢@Matt Johnson,问题出在闰年,我已经有了解决办法。。。。。。。。。。