代码之家  ›  专栏  ›  技术社区  ›  Matthew Hood

system.linq.dynamic和datetime

  •  12
  • Matthew Hood  · 技术社区  · 15 年前

    我使用system.linq.dynamic在.NET MVC 1.0中执行来自Ajax调用的自定义where子句。

    它对字符串、int等有效,但对datetime无效,我得到的异常是无法将字符串与datetime进行比较。最简单的测试代码是

    items=items.where(string.format(@“0>1 2 1”,searchfield,delimiter,searchstring));

    其中searchfield将是例如start_date,数据类型是datetime,delimiter是“(尝试不使用任何东西),searchstring将是01-jan-2009(尝试使用01/01/2009),items是LinqToSQL中的可查询项。

    有没有一种在动态中指定数据类型的方法,或者有更好的方法。它目前已经在使用一些反射来计算需要什么类型的分隔符。

    5 回复  |  直到 7 年前
        1
  •  18
  •   tvanfosson    15 年前

    我认为您可以将searchString转换为日期时间,并将其作为参数传递给动态where方法本身。

    itmes = items.Where( string.Format( "{0} > @0", searchField ),
                         DateTime.Parse( searchString ) );
    
        2
  •  6
  •   D.Kempkes    11 年前
    yourlist.Where("PostDate > DateTime(2013, 07, 24)");
    
        3
  •  3
  •   Seb Boulet    12 年前

    我用convert.todatetime来解决这个问题,因为我在做类似于kappasims的事情。

    items = items.Where(string.Format("{0} > Convert.ToDateTime(\"{1}\")", searchField, searchValue); 
    
        4
  •  3
  •   Richard Rout    11 年前

    如果你只想 Where([string]) 格式,而不是传递其他参数,您可以使用日期格式 Date(yyyy, mm, dd) . 所以我可以通过

    items.Where("DateAdded > Date(2013, 06, 18)")
    

    有一个完整的规格 here 它概述了解析和有效使用。

        5
  •  1
  •   kappasims    15 年前

    如果整个lambda是动态创建的(我们将使用equals而不是greater),并且类型未知怎么办?在这种情况下,不能在where参数中使用datetime.parse。如果尝试传入datetime对象,动态Linq将其解释为Int32类型。你能不能先转换日期时间的刻度或毫秒,然后比较一下?