System.Linq.Dynamic和DateTime

时间:2009-09-07 15:19:44

标签: c# linq dynamic system.linq.dynamic

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

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

5 个答案:

答案 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的滴答滴答或毫秒数并比较它来实现吗?