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

时间:2013-01-02 17:19:08

标签: c# string linq entity-framework dynamic-linq

我正在使用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);

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

提前致谢!

6 个答案:

答案 0 :(得分:13)

我能够使用信息here来使用稍微不同的字符串格式。

这样做对我来说很好:

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

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

答案 1 :(得分:4)

对于当前的DynamicLINQ库,我似乎无法做到这一点。 Tilak在下面详细介绍了它不起作用的原因。

我的解决方案是修改DynamicLINQ库以允许将查询写为字符串并传递给Date / Time数据类型的where子句。 Paul Hatcher在此发现了修改:LINQ TO SQL, Dynamic query with DATE type fields

答案 2 :(得分:1)

ObjectQuery.Where overload接受2个参数。

  1. string predicate
  2. params ObjectParameter[] parameters
  3. 在第一个示例中,Where使用ObjectParameter参数构建查询(where子句)(使用ObjectParameter的名称,类型和值)

    在你的第二个例子中,传递的内容被视为final where子句(没有基于传递的参数的数据类型进行内部转换)。

答案 3 :(得分:1)

根据Richard Rout的选择,略作修改:

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

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

答案 4 :(得分:0)

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

答案 5 :(得分: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]