c# - 使用实体框架从日期列表检查数据库表中是否存在任何值
问题描述
我有一个这样的日期列表:
DateTime now = DateTime.Today;
var expiriesDays = new List<int> { 1, 7, 14 };
List<DateTime> expiriesDates = expiriesDays.Select(x => now.AddDays(x).Date).ToList();
现在我有一个表,它有一个带有名称的字段ComplianceExpiryDate
,现在我想检查这个字段是否有任何值expiriesDates
。
就像任何记录的价值一样,例如 13-07-2021 OR 19-07-2021 OR 26-07-2021 inComplianceExpiryDate
我只想与日期进行比较,而不是时间。
我试过了,TruncateTime
但是DbFunctions
没有显示使用这个函数并且抛出了一个错误。
解决方案
这是使用IN
.
您还应该测试@GertArnold 的解决方案,以了解最适合您的情况。@GertArnold 的回答是使用OR
而不是IN
,但是当你的数据库增长时可能会表现得更好。
var today = DateTime.Today;
// create a list of dates without time-part specified
var expiryDays = new List<int> { 1, 7, 14 };
var expirationDates = expiryDays
.Select(it => today.AddDays(it))
.ToList();
// insert test data into db
var currentId = 1;
foreach (var currentDate in expirationDates)
{
db.MyTables.Add(new MyTable
{
Id = currentId,
ComplianceExpiryDate = currentDate.AddHours(3) // move time a few hours into the day
});
currentId++;
}
db.SaveChanges();
var numberOfMatchingItems = db.MyTables
.Count(e => expirationDates.Contains(e.ComplianceExpiryDate.Date));
Console.WriteLine(
$"Number of matching dates found in db: {numberOfMatchingItems}");
输出:
在 db 中找到的匹配日期数:3
我将此定义用于带有日期的实体类:
public class MyTable
{
public int Id { get; set; }
public DateTime ComplianceExpiryDate { get; set; }
}
EF生成的SQL:
SELECT COUNT(*)
FROM "MyTables" AS "m"
WHERE rtrim(rtrim(strftime('%Y-%m-%d %H:%M:%f', "m"."ComplianceExpiryDate", 'start of day'), '0'), '.') IN ('2021-07-14 00:00:00', '2021-07-20 00:00:00', '2021-07-27 00:00:00')
推荐阅读
- matlab - 为 writematrix 设置回车类型
- database - 行 ID 与位图索引一起存储在哪里?
- docker - 如何通过 RabbitMQ docker 禁用明文身份验证?
- python - 在python中附加具有不同列的excel文件
- python - 如何让母球移动到给定的航向?
- java - 具有枚举类型字段的 Java 枚举
- python - 如何将多个表格从 Excel 转换为 JSON
- gem5 - 如何在 gem5 中实现完美的分支预测器
- sql-server - SSIS 从带有 Where 条件的 Excel 工作表中选择
- flutter - 从 dart 中的类型对象调用类的构造函数