8

我将 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);

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

提前致谢!

4

8 回答 8

16

使用此处的信息,我能够使其使用稍微不同的字符串格式。

这样做对我来说很好:

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

请注意,这根本不适用于DateTimeOffset列。

于 2013-06-18T13:42:18.243 回答
4

看来我试图做的事情对于当前的 DynamicLINQ 库是不可能的。Tilak 在下面很好地概述了它不起作用的原因。

我的解决方案是修改 DynamicLINQ 库以允许将查询编写为字符串并传递给日期/时间数据类型的 where 子句。Paul Hatcher 在这里找到了修改:LINQ TO SQL, Dynamic query with DATE type fields

于 2013-01-03T19:52:15.547 回答
1

ObjectQuery.Where 重载接受 2 个参数。

  1. string predicate
  2. params ObjectParameter[] parameters

在您的第一个示例中,使用参数(使用名称、类型和值)Where构建查询(where 子句)ObjectParameterObjectParameter

在您的第二个示例中,传递的任何内容都被视为最终的 where 子句(没有基于传递参数的数据类型完成的内部转换)。

于 2013-01-02T17:32:01.607 回答
1

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

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

这适用于我的 Linq2Entities 解决方案。请注意,DateTime而不是Date. 希望这可以避免这个问题给我带来的头痛。

于 2014-03-07T15:39:28.617 回答
0

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

于 2013-01-02T17:20:50.393 回答
0

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

  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[.nnn]

于 2021-06-21T21:06:14.377 回答
0

我知道这是一个老问题,但如果有人仍然遇到 ASP.Net Core 的这个问题,我可以通过以下方式解决它。

基本上,您必须使用 Column 属性添加实体类(表列)并指定 TypeName。对于上面的问题,如下:

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

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

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

于 2021-10-13T14:20:29.023 回答
0

有点老问题,但如果这对其他人有帮助,我的问题是它正在使用我的 DateTime 并将其设为字符串。所以简单的解决方法是让它再次约会。就像是:

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

这比 The_Outsider 所说的添加 column 属性要多一点打字,但只是另一种选择。

于 2021-11-16T16:28:51.123 回答