动态LINQ日期时间比较字符串构建-LINQ-To实体

本文关键字:构建 -LINQ-To 实体 字符串 比较 LINQ 日期 时间 动态 | 更新日期: 2023-09-27 17:50:31

我正在使用Scott Guthrie的动态LINQ库以及Entity Framework和C#。

我必须根据几个因素将where字符串构建成一个变量,然后将字符串变量传递给where子句。出于某种原因,这将起作用:

ContactList = ContactList.Where("DateAdded >= @0", DateTime.Parse("12/1/2012"));

但这不会起作用

string WhereClause = string.Format("DateAdded >= {0}", DateTime.Parse("12/1/2012"));
ContactList = ContactList.Where(WhereClause);

如前所述,我需要在传递变量的版本中使用它。有人知道为什么第二个不起作用吗?

提前感谢!

动态LINQ日期时间比较字符串构建-LINQ-To实体

使用这里的信息,我能够使用稍微不同的字符串格式使其工作。

这样做对我来说效果很好:

ContactList.Where("DateAdded >= DateTime(2013, 06, 18)")

请注意,这对DateTimeOffset列根本不起作用。

对于当前的DynamicLINQ库,我想要做的似乎是不可能的。Tilak在下面很好地概述了它不起作用的原因。

我的解决方案是修改DynamicLINQ库,以允许将查询写成字符串,并将其传递给日期/时间数据类型的where子句。修改由Paul Hatcher在这里找到:LINQ TO SQL,具有DATE类型字段的动态查询

ObjectQuery。其中过载接受2个参数。

  1. string predicate
  2. params ObjectParameter[] parameters

在第一个示例中,Where使用ObjectParameter参数(使用ObjectParameter的Name、Type和Value(构建查询(where子句(

在第二个示例中,传递的内容都被视为最终where子句(不进行基于传递参数数据类型的内部转换(。

基于Richard Rout的选项,稍作修改:

ContactList.Where("DateAdded >= DateTime(2013, 06, 18)")

这适用于我的Linq2Entities解决方案。注意DateTime而不是Date。希望这能让别人省去这个问题给我带来的头痛。

ContactList.Where可能会在非数字参数(如DateTime(周围加引号。在你的第二个字符串中没有引用日期。

在动态linq核心和sql server的ef 3.1中也有类似的问题,通过显式设置列类型来解决:

  1. 流利的方式:

    modelBuilder.Entity<Contact>().Property(p => p.DateAdded).HasColumnType("datetime")
    
  2. 属性方式:

    public class Contact
    {
         [Column(TypeName = "datetime")]
         public DateTime DateAdded { get; set; }
    }
    

用法:

ContactList = ContactList.Where("DateAdded == @0", "2021-03-25 02:29:00.000");

sql server日期时间格式:YYYY-MM-DD hh:MM:ss[.nnnn]

我知道这是一个老问题,但如果有人仍然在ASP中遇到这个问题。Net Core,我能够如下解决它。

基本上,您必须添加具有column属性并指定TypeName的Entity类(表列(。对于上述问题,如下所示:

[Column(TypeName = "datetime")]
public DateTime DateAdded { get; set; }

这应该可以修复数据类型转换错误。

来源:https://github.com/zzzprojects/System.Linq.Dynamic.Core/issues/240

这是一个老问题,但如果这对其他人有帮助,我的问题是它占用了我的DateTime并使其成为字符串。因此,简单的解决办法就是再次约会。类似于:

var where = $"{propertyName} >= DateTime.Parse('"{startDate}'") and {propertyName} <= DateTime.Parse('"{endDate}'")";
query = query.Where(where);

这比the_Outsider所说的添加column属性多一点打字,但只是另一个选项。