You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Date类型在EF Core LinQ查询中比较失效的问题及解决方法

问题解决方案
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
    configurationBuilder.Properties<Date>()
        .HaveConversion<DateConverter>()
        .HaveColumnType("date");
}

问题背景

我自定义了一个Date类型,它是DateOnly类型的包装类,核心差异在于实现了以下三个隐式转换方法:

public static implicit operator Date(DateTime dateTime) => ConvertFromDateTime(dateTime);
public static implicit operator Date(DateTimeOffset dateTimeOffset) => ConvertFromDateTimeOffset(dateTimeOffset.Date);
public static implicit operator DateTime(Date date) => date.ConvertToDateTime();

同时实现了对应的转换器和比较器类:

internal class DateConverter : ValueConverter<Date, DateTime>
{
    public DateConverter() : base(
        date => date,
        dateTime => dateTime)
    {
    }
}


internal class DateComparer : ValueComparer<Date>
{
    public DateComparer() : base(
        (d1, d2) => d1 == d2,
        d => d.GetHashCode())
    {
    }
}

该类型可正常读写数据库,但使用LinQ表达式进行比较时出现异常:

DateTime dateTime = new DateTime(2023, 04, 03, 12, 0, 0);
DateTimeOffset dateTimeOffset = new DateTimeOffset(dateTime);
Date date = Date.ConvertFromDateTime(dateTime);

var something_date_check = await Something
    .Where(s => s.Deadline > date)
    .ToListAsync(cancellationToken);

var something_datetime_check = await Something
    .Where(s => s.Deadline > dateTime)
    .ToListAsync(cancellationToken);

var something_datetimeoffset_check = await Something
    .Where(s => s.Deadline > dateTimeOffset)
    .ToListAsync(cancellationToken);

其中Deadline为自定义Date类型,经排查发现自定义比较器从未执行,推测EF将Date类型强制转换为DateTime导致结果错误,最终通过上述ConfigureConventions配置解决该问题。


内容的提问来源于stack exchange,提问作者Amentos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:17:39