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, разделитель, searchString));
Где searchField будет, например, start_date, а тип данных - DateTime, разделитель "(тоже ничего не пытался), а searchString будет 01 января 2009 года (также с 01/01/2009), и элементы IQueryable из LinqToSql.
Есть ли способ указать тип данных в динамике, где, или есть лучший подход. В настоящее время уже используется некоторое отражение для определения того, какой тип разделителя требуется.
Ответы
Ответ 1
Я думаю, что вы можете преобразовать searchString в DateTime и передать его в качестве параметра для динамического метода, где сам метод.
itmes = items.Where( string.Format( "{0} > @0", searchField ),
DateTime.Parse( searchString ) );
Ответ 2
yourlist.Where("PostDate > DateTime(2013, 07, 24)");
Ответ 3
Я использовал Convert.ToDateTime для решения проблемы, так как я делаю что-то похожее на Kappasims
items = items.Where(string.Format("{0} > Convert.ToDateTime(\"{1}\")", searchField, searchValue);
Ответ 4
Если вы хотите сделать это только с форматом Where([string])
, не проходя в других параметрах, вы можете использовать формат даты Date(yyyy, mm, dd)
. Поэтому я смог получить эту работу, выполнив
items.Where("DateAdded > Date(2013, 06, 18)")
Здесь существует полная спецификация которая описывает синтаксический анализ и действительные использования.
Ответ 5
Что делать, если вся лямбда создается динамически (мы будем идти с равными вместо большего), и тип неизвестен? В этом случае вы не можете использовать DateTime.Parse в параметрах where. Если вы попытаетесь передать объект DateTime, Dynamic LINQ интерпретирует его как тип int32. Не могли бы вы это сделать, сначала конвертируя тики или миллисекунды DateTime и сравнивая это?