【问题标题】:Exclude time comparison from Datetime field in Dynamic LINQ Expressions从动态 LINQ 表达式中的日期时间字段中排除时间比较
【发布时间】:2021-06-14 18:57:06
【问题描述】:

我想生成一个动态 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))}

这将排除此时间检查并仅与日期进行比较

【问题讨论】:

  • 我意识到这不是确切的问题,所以我不会把它作为答案,但一个非常常见的解决方法是扩展你的比较以包括两个条件,一个大于或等于日期的开始时间 (00:00:00) 并且小于第二天的开始时间 (00:00:00) - 如果您没有想到这种方法。
  • @LawrenceJohnson :上述解决方案将起作用,但我只想在表达式本身中添加一些条件/常量(如 StringComparison.OrdinalIgnoreCase)以避免时间检查

标签: c# .net entity-framework linq expression


【解决方案1】:

不要这样做;走建议使用日期范围的路线

在完成比较之前,请始终避免创建操作表数据的查询。假设您有一个包含一千万个日期时间的表,并且它们都已编入索引

数据库可能会为此使用索引:

WHERE datecol >= '2001-01-01' and datecol < '2001-01-02'

数据库可能不会为此使用索引:

WHERE CAST(datecol as DATE) = '2001-01-01' 

.. 所以每次查询数据库都会完全扫描表或索引,在进行比较之前转换所有一千万个值中的每一个

【讨论】:

    【解决方案2】:

    您可以在 C# linq 中尝试以下代码:-

    var data = collection.Where(t=> DbFunctions.TruncateTime(t.CreatedDate)==DbFunctions.TruncateTime(dateVariable)).ToList();
    

    以上代码会在 Linq 中进行字段比较时排除时间。

    【讨论】:

    • 我的问题是关于如何在 Dynamic Linq Expression 而不是直接 LINQ 中做同样的事情
    猜你喜欢
    • 2020-12-01
    • 2020-12-16
    • 2012-12-17
    • 1970-01-01
    • 2010-09-11
    • 2014-09-28
    • 2012-02-07
    • 2013-10-28
    • 2012-01-20
    相关资源
    最近更新 更多