System.Linq.Dynamic и DateTime
Я использую System.Linq.Dynamic, чтобы сделать пользовательские предложения where из вызова ajax в.Net MVC 1.0.
Он отлично работает для строк, int и т. Д., Но не для DateTime, я получаю исключение, не могу сравнить String с DateTime. Очень простой тестовый код
items = items.Where(string.Format(@" {0} > {1}{2}{1} ", searchField, delimiter, searchString));
Где searchField будет, например, start_date, а тип данных - DateTime, delimiter - это " (пробовал также и без ничего), а searchString будет 01-янв-2009 (пробовал также с 01/01/2009), а элементы IQueryable из LinqToSql.
Есть ли способ указать тип данных в динамическом где, или есть лучший подход. В настоящее время уже используется некоторое отражение, чтобы определить, какой тип разделителя требуется.
5 ответов
Я думаю, что вы можете преобразовать searchString в DateTime и передать его в качестве параметра динамическому методу where.
itmes = items.Where( string.Format( "{0} > @0", searchField ),
DateTime.Parse( searchString ) );
Я использовал Convert.ToDateTime для решения этой проблемы, так как я делаю что-то похожее на Kappasims
items = items.Where(string.Format("{0} > Convert.ToDateTime(\"{1}\")", searchField, searchValue);
Если вы хотите сделать это только с Where([string])
формат, не передавая другие параметры, вы можете использовать формат даты Date(yyyy, mm, dd)
, Таким образом, я смог заставить это работать, делая
items.Where("DateAdded > Date(2013, 06, 18)")
Здесь есть полная спецификация, которая описывает синтаксический анализ и правильное использование.
Что, если вся лямбда создается динамически (мы будем использовать равно, а не больше), а тип неизвестен? В этом случае вы не можете использовать DateTime.Parse в параметрах where. Если вы попытаетесь передать объект DateTime, Dynamic LINQ интерпретирует его как тип int32. Не могли бы вы сделать это, сначала преобразовав тики или миллисекунды в DateTime и сравнив их?