c# - 从动态 LINQ 表达式中的日期时间字段中排除时间比较
问题描述
我想生成一个动态 LINQ 表达式以仅使用日期进行过滤,但我的列是数据库中的日期时间字段。因此,运算符“等于”和“不等于”不起作用,因为它在我的输入中附加了一些默认时间并尝试与数据匹配。如果有任何方法可以生成一个 LINQ 表达式,该表达式将通过排除时间来仅比较日期。
这是我的代码:
// for type conversion start
var propertyType = ((PropertyInfo)propertyName.Member).PropertyType;
var converter = TypeDescriptor.GetConverter(propertyType);
if (!converter.CanConvertFrom(typeof(string)))
throw new NotSupportedException();
var propertyValue = ReturnPropertyValue(rule, converter);
var constant = Expression.Constant(propertyValue);
var valueExpression = Expression.Convert(constant, propertyType); //{Convert(5/24/2021 12:00:00 AM, DateTime)}
// for type conversion ends
// returning the expression
return Expression.Equal(propertyName, valueExpression);
// {(Param_0.CreatedDate == Convert(5/24/2021 12:00:00 AM, DateTime))}
但在这里我需要这样的东西
{(Param_0.CreatedDate == Convert(5/24/2021 12:00:00 AM, Date))}
这将排除此时间检查,并将仅与日期进行比较
解决方案
不要这样做;走建议使用日期范围的路线
在完成比较之前,请始终避免创建操作表数据的查询。假设您有一个包含一千万个日期时间的表,并且它们都已编入索引
数据库可能会为此使用索引:
WHERE datecol >= '2001-01-01' and datecol < '2001-01-02'
数据库可能不会为此使用索引:
WHERE CAST(datecol as DATE) = '2001-01-01'
..所以每次查询数据库时都会完全扫描表或索引,在进行比较之前转换所有一千万个值中的每一个
推荐阅读
- bash - Bash shell如何将日期格式化为月份的小写?
- shell - 在 shell 脚本中编译和链接不同目录上的文件
- mysql - 在 ssh 命令中设置 autocommit=0
- sass - Angular Dart - 使用 sass 文件
- javascript - 尝试分配权限时节点 ACL 不起作用
- python - 不知道如何在 python 中更新分数
- java - 如何使用自定义注释在 Spring Boot 中隐藏带注释的字段?
- json - Xamarin 应用程序在电话虚拟但不发送物理时发送 Json 数据
- sql - SQL 相交嵌套查询
- c# - 持久登录 Microsoft-Graph c# SDK