首页 > 解决方案 > 使用实体框架从日期列表检查数据库表中是否存在任何值

问题描述

我有一个这样的日期列表:

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没有显示使用这个函数并且抛出了一个错误。

标签: c#asp.net.netentity-frameworkentity-framework-core

解决方案


这是使用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')

推荐阅读