12

我正在使用 System.Linq.Dynamic 从 .Net MVC 1.0 中的 ajax 调用中自定义 where 子句。

它适用于字符串、int 等,但不适用于 DateTime,我得到异常无法将 String 与 DateTime 进行比较。非常简单的测试代码是

items = items.Where(string.Format(@" {0} > {1}{2}{1} ", searchField, delimiter, searchString));

例如,其中 searchField 将是 start_date 并且数据类型是 DateTime,分隔符是 "(也没有尝试过),并且 searchString 将是 01-Jan-2009(也尝试过 01/01/2009)并且 items 是来自的 IQueryable LinqToSql。

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

4

5 回答 5

19

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

itmes = items.Where( string.Format( "{0} > @0", searchField ),
                     DateTime.Parse( searchString ) );
于 2009-09-07T15:47:55.037 回答
6
yourlist.Where("PostDate > DateTime(2013, 07, 24)");
于 2013-07-24T13:43:21.233 回答
3

我使用 Convert.ToDateTime 来解决这个问题,因为我正在做类似于 Kappasims 的事情

items = items.Where(string.Format("{0} > Convert.ToDateTime(\"{1}\")", searchField, searchValue); 
于 2012-07-10T21:17:21.467 回答
3

如果您只想使用Where([string])格式而不是传递其他参数来执行此操作,则可以使用日期格式Date(yyyy, mm, dd)。所以我能够通过这样做来完成这项工作

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

这里有一个完整的规范,概述了解析和有效用途。

于 2013-06-18T13:45:40.347 回答
1

如果整个 lambda 是动态创建的(我们将使用等于而不是大于)并且类型未知怎么办?在这种情况下,您不能在 where 参数中使用 DateTime.Parse。如果您尝试传入 DateTime 对象,Dynamic LINQ 会将其解释为 int32 类型。您可以通过先转换 DateTime 的刻度或毫秒并进行比较来做到这一点吗?

于 2010-01-29T22:46:03.650 回答