我正在使用System.Linq.Dynamic在.Net MVC 1.0中执行ajax调用的自定义子句。
它适用于字符串,int等但不适用于DateTime,我得到的异常无法将String与DateTime进行比较。非常简单的测试代码是
items = items.Where(string.Format(@“{0}> {1} {2} {1}”,searchField,delimiter,searchString));
其中searchField将是例如start_date,数据类型是DateTime,分隔符是“(没有尝试过),searchString将是2009年1月1日(也在01/01/2009尝试过),项目是来自LinqToSql的IQueryable。
有没有办法在动态中指定数据类型,或者有更好的方法。它目前已经使用一些反射来确定需要什么类型的分隔符。
答案 0 :(得分:18)
我认为您可以将searchString转换为DateTime并将其作为参数传递给动态where方法本身。
itmes = items.Where( string.Format( "{0} > @0", searchField ),
DateTime.Parse( searchString ) );
答案 1 :(得分:6)
yourlist.Where("PostDate > DateTime(2013, 07, 24)");
答案 2 :(得分:3)
我使用Convert.ToDateTime来解决问题,因为我正在做类似于Kappasims的事情
items = items.Where(string.Format("{0} > Convert.ToDateTime(\"{1}\")", searchField, searchValue);
答案 3 :(得分:3)
如果您只想使用Where([string])
格式执行此操作,而不是传递其他参数,则可以使用日期格式Date(yyyy, mm, dd)
。所以我能够通过
items.Where("DateAdded > Date(2013, 06, 18)")
有一个完整的规范here概述了解析和有效用途。
答案 4 :(得分:1)
如果整个lambda是动态创建的(我们将使用equals而不是大于),并且类型未知?在这种情况下,您不能在where参数中使用DateTime.Parse。如果您尝试传入DateTime对象,Dynamic LINQ会将其解释为int32类型。您可以通过首先转换DateTime的滴答滴答或毫秒数并比较它来实现吗?