自定义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
相关产品推荐
相关产品推荐

