使用 EF 核心 3 将字符串与日期进行比较
Posted
技术标签:
【中文标题】使用 EF 核心 3 将字符串与日期进行比较【英文标题】:Comparing strings as dates using EF core 3 【发布时间】:2020-08-04 05:55:37 【问题描述】:我正在将一些代码从 asp.net 迁移到 asp.net 核心,但我找不到以字符串格式“yyyyMMdd”比较日期的方法,即 Datediff(day, column, "value" ) == x,数据库是 SQLServer,不能更改列类型。
我正在使用使事情复杂化的反射。
asp.net中的代码是
public static Expression ExpressionsDiffDate(Expression cte, Expression property)
MethodInfo DateDiff = typeof(SqlFunctions).GetMethod("DateDiff", new Type[] typeof(string), typeof(string), typeof(string) );
if (property.Type == typeof(DateTime) || property.Type == typeof(DateTime?))
DateDiff = typeof(SqlFunctions).GetMethod("DateDiff", new Type[] typeof(string), typeof(DateTime), typeof(DateTime) );
property = Expression.Convert(property, typeof(DateTime?));
cte = ConvertExpressionToDate(cte);
return Expression.Call(
DateDiff,
Expression.Constant("day"),
cte,
property
);
在这个例子中,我使用类 sqlfunctions 中的 datediff 方法,它有很多重载,取决于列类型,我使用将 datetime 作为参数的方法或使用字符串的方法。
我设法在 .net 核心中为 DateTime 类型的列做到了这一点
public static Expression ExpressionsDiffDate(Expression cte, Expression property)
ParameterExpression exFun = Expression.Parameter(typeof(DbFunctions));
MethodInfo DateDiff = typeof(SqlServerDbFunctionsExtensions).GetMethod("DateDiffDay", new Type[] typeof(DbFunctions), typeof(DateTime), typeof(DateTime) );
return Expression.Call(
DateDiff,
exFun,
cte,
property
);
但我不知道如何对字符串类型的列执行此操作,因为它没有任何接受字符串的重载。
谢谢
【问题讨论】:
【参考方案1】:下面的“双重施法”技术
(DateTime)(object)stringExpr
或
(DateTime?)(object)stringExpr
可用于欺骗 C# 编译器将string
类型表达式视为DateTime
,从而允许您调用DateTime
或DateTime?
重载DateDiff
方法(或使用DateTime
运算符)。
用于 SqlServer 的 EF Core 查询翻译器将生成 CAST
到 datetime
或 datetime2
类型,这应该尝试从字符串进行默认 SqlServer 转换。
例如像这样的
if (property.Type == typeof(string))
property = Expression.Convert(Expression.Convert(property, typeof(object)), typeof(DateTime));
【讨论】:
非常感谢以上是关于使用 EF 核心 3 将字符串与日期进行比较的主要内容,如果未能解决你的问题,请参考以下文章
从firestore查询数据时,如何将保存的字符串格式的日期与当前日期进行比较?
将 java epoch 字符串与 php epoch 日期进行比较
在保存到核心数据之前将字符串与 NSPredicate 进行比较
Mysql - 如何将字符串中的日期与查询中的unix时间进行比较