动态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);
如前所述,我需要在传递变量的版本中使用它。有人知道为什么第二个不起作用吗?
提前感谢!
使用这里的信息,我能够使用稍微不同的字符串格式使其工作。
这样做对我来说效果很好:
ContactList.Where("DateAdded >= DateTime(2013, 06, 18)")
请注意,这对DateTimeOffset
列根本不起作用。
对于当前的DynamicLINQ库,我想要做的似乎是不可能的。Tilak在下面很好地概述了它不起作用的原因。
我的解决方案是修改DynamicLINQ库,以允许将查询写成字符串,并将其传递给日期/时间数据类型的where子句。修改由Paul Hatcher在这里找到:LINQ TO SQL,具有DATE类型字段的动态查询
ObjectQuery。其中过载接受2个参数。
string predicate
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中也有类似的问题,通过显式设置列类型来解决:
-
流利的方式:
modelBuilder.Entity<Contact>().Property(p => p.DateAdded).HasColumnType("datetime")
-
属性方式:
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属性多一点打字,但只是另一个选项。