Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果离存储日期还有7天,请检查C#MVC Linq_C#_Linq_Date_Datetime - Fatal编程技术网

如果离存储日期还有7天,请检查C#MVC Linq

如果离存储日期还有7天,请检查C#MVC Linq,c#,linq,date,datetime,C#,Linq,Date,Datetime,在MVC5控制器Linq查询中,我希望在离指定日期还有7天的时候,每天向我的客户发送提醒电子邮件。这个日期不是完整的日期,它只是一个月的日期值,它以int(1到28)的形式存储在mysql数据库中。所以我有一个hangfire后台脚本,它每天都会检查这个条件,并向满足这个条件的客户发送电子邮件 var rem = db.DDs.Where(a => (new DateTime(DateTime.Today.Year, DateTime.Today.Month,a.Day).AddMonth

在MVC5控制器Linq查询中,我希望在离指定日期还有7天的时候,每天向我的客户发送提醒电子邮件。这个日期不是完整的日期,它只是一个月的日期值,它以int(1到28)的形式存储在mysql数据库中。所以我有一个hangfire后台脚本,它每天都会检查这个条件,并向满足这个条件的客户发送电子邮件

var rem = db.DDs.Where(a => (new DateTime(DateTime.Today.Year, DateTime.Today.Month,a.Day).AddMonths(1)==DateTime.Today.AddDays(7))).ToList();
我不确定上述查询是否是最好的方法

更新我已更新。现在更新到。今天,并测试是否收到此错误


Message=“LINQ to Entities无法识别“System.DateTime AddMonths(Int32)”方法,并且无法将此方法转换为存储表达式。”

请阅读对该问题的所有注释。通常
DateTime
存储日期和时间部分。因此,您必须将查询更改为:

DateTime dbeg = DateTime.Today.AddDays(-7);
DateTime dend = dbeg.AddDays(1).AddSeconds(-1);

var rem = db.DDs.Where(a => a>=dbeg && a<=dend).ToList();
//returns data between: #2016-06-11 00:00:00# and #2016-06-11 23:59:59#
DateTime dbeg=DateTime.Today.AddDays(-7);
DateTime dend=dbeg.AddDays(1.AddSeconds(-1);

var rem=db.DDs。其中(a=>a>=dbeg&&a请阅读问题的所有注释。通常
DateTime
存储日期和时间部分。因此,您必须将查询更改为:

DateTime dbeg = DateTime.Today.AddDays(-7);
DateTime dend = dbeg.AddDays(1).AddSeconds(-1);

var rem = db.DDs.Where(a => a>=dbeg && a<=dend).ToList();
//returns data between: #2016-06-11 00:00:00# and #2016-06-11 23:59:59#
DateTime dbeg=DateTime.Today.AddDays(-7);
DateTime dend=dbeg.AddDays(1.AddSeconds(-1);

var rem=db.DDs.Where(a=>a>=dbeg&&a如果我理解正确,您可以只向
a.Day
等于整数值的客户端发送邮件。由于您每天发送一次,因此您永远不会发送两次邮件:

var dayNumber = ....
var rem = db.DDs.Where(a => a.Day == dayNumber);
现在的问题是:如何确定日数

显然,应该使用
DateTime.Today.Day
,然后查看提前7天的
a.Day
值。即:

dayNumber = DateTime.Today.Day + 7;
但是如果
DateTime.Today.Day
22
或更大呢?那么
dayNumber=29
,它大于
28
,所以你不发送邮件。或者你呢?在非闰年,一周后的2月22日是3月1日,所以
dayNumber
应该计算为
1
。所以一个月的天数也应该是正确数字的计算结果为:

var date = DateTime.Now;
var daysInMonth = DateTime.DaysInMonth(date.Year, date.Month);
var dayNumber = (date.Day + 6) % daysInMonth + 1;
这里,
%
是模运算符,例如,
37%31=6

请注意,
dayNumber=(date.Day+7)%daysInMonth
将在
date.Day+7
等于
daysInMonth
的月份的每一天生成
0
值。因此,
date.Day+6
以及随后添加的
1

只是一些示例输出:

20-01-16: 27
21-01-16: 28
22-01-16: 29
23-01-16: 30
24-01-16: 31
25-01-16: 1
...
30-01-16: 6
31-01-16: 7
01-02-16: 8
02-02-16: 9
...
20-02-16: 27
21-02-16: 28
22-02-16: 29
23-02-16: 1
24-02-16: 2
...
29-02-16: 7
01-03-16: 8
02-03-16: 9
...
24-03-16: 31
25-03-16: 1
26-03-16: 2
...
31-03-16: 7
01-04-16: 8
02-04-16: 9

因此,在闰年,比如2016年,在2月22日,你不会发送邮件(=>2月29日),而在非闰年,你会发送邮件。

如果我理解正确,你可以只向客户发送邮件,其中
a.Day
等于一个整数值。既然你每天发送一次,你就永远不会发送两次邮件:

var dayNumber = ....
var rem = db.DDs.Where(a => a.Day == dayNumber);
现在的问题是:如何确定日数

显然,应该使用
DateTime.Today.Day
,然后查看提前7天的
a.Day
值。即:

dayNumber = DateTime.Today.Day + 7;
但是如果
DateTime.Today.Day
22
或更大呢?那么
dayNumber=29
,它大于
28
,所以你不发送邮件。或者你呢?在非闰年,一周后的2月22日是3月1日,所以
dayNumber
应该计算为
1
。所以一个月的天数也应该是正确数字的计算结果为:

var date = DateTime.Now;
var daysInMonth = DateTime.DaysInMonth(date.Year, date.Month);
var dayNumber = (date.Day + 6) % daysInMonth + 1;
这里,
%
是模运算符,例如,
37%31=6

请注意,
dayNumber=(date.Day+7)%daysInMonth
将在
date.Day+7
等于
daysInMonth
的月份的每一天生成
0
值。因此,
date.Day+6
以及随后添加的
1

只是一些示例输出:

20-01-16: 27
21-01-16: 28
22-01-16: 29
23-01-16: 30
24-01-16: 31
25-01-16: 1
...
30-01-16: 6
31-01-16: 7
01-02-16: 8
02-02-16: 9
...
20-02-16: 27
21-02-16: 28
22-02-16: 29
23-02-16: 1
24-02-16: 2
...
29-02-16: 7
01-03-16: 8
02-03-16: 9
...
24-03-16: 31
25-03-16: 1
26-03-16: 2
...
31-03-16: 7
01-04-16: 8
02-04-16: 9

所以,在闰年,比如2016年,在2月22日,你不发送邮件(=>2月29日),而在非闰年,你会的。

我不知道查询是否会真正运行。我不相信MySQL数据库适配器能够将复杂的where条件编译成SQL。你能成功运行它吗?如果你不存储时间,那么你想使用
DateTime。今天
r大于
DateTime。现在
因为后者包括时间,所以你的相等性测试总是会失败,除非它正好在午夜运行。存储日期和时间部分!我不确定查询是否会实际运行。我不相信MySQL数据库适配器能够将复杂的where条件编译成SQL.您是否能够成功运行它?如果您没有存储时间,那么您希望使用
DateTime.Today
而不是
DateTime.Now
,因为后者包含时间,所以您的平等性测试将始终失败,除非它正好在午夜运行。存储日期和时间部分!