Предикат, где условие не работает в IQueryable, но работает после преобразования IQueryable в ToList () - PullRequest
0 голосов
/ 21 февраля 2019
var predicate = PredicateBuilder.New<Items>(true);
predicate = predicate.Or(i => Convert.ToDateTime(i.Entrydate).ToString("M/d/yyyy").Contains(searchText));`

Entrydate имеет тип DateTime?, поэтому напрямую я не могу использовать .ToString('M/d/yyyy') формат строки.

Это не работает (исключение: Must be reducible node)

IQueryable<Items> items = Repository.GetItems(orderNo).Where(predicate);

Это работает

IQueryable<Items> items = Repository.GetItems(orderNo).ToList().Where(predicate).AsQueryable();

Но я не хочу преобразовывать результаты в список, пока они находятся в IQueryable

Обратите внимание: я использую Convert.ToDateTime() метод в предикат (динамический), где условие

1 Ответ

0 голосов
/ 21 февраля 2019

То есть у вас есть класс Items, с DateTime?свойство EntryDate.И вам нужно в качестве входных данных для вашего построителя предикатов `Expression>, который представляет предикат, который возвращает true, если строковое представление Items.EntryDate содержит некоторый searchText.

Другими словами, если EntryDate равен" 23 декабря 2003 ", тогда его строковое представление - «25.12.2003», и вы хотите вернуть true, если оно содержит searchText.

Увы, вы не указали, что хотите, если EntryDate имеет значение null.Я предполагаю, что вы хотите вернуть false.

Expression<Func<Items, bool>> predicate = (items.EntryDate != null)
   && (items.EntryDate.ToString("M/d/yyyy").Contains(searchText));

Вы можете использовать это в своем PredicateBuilder.

Кстати: я думаю, что не стоит сравнивать текстовые представления DateTime.Это зависит от культуры.

...