Построитель предикатов со сравнением даты и времени
Я только начинаю использовать linq kit и думаю, что это круто, но у меня 2 проблемы
у меня есть эта коллекция элементов, которые могут быть отфильтрованы по нескольким условиям a, b, c, d, e(не важно) и someDate (datetime)
так что у меня есть такой предикат
var predicate = PredicateBuilder.True<Item>();
if (!string.IsNullOrEmpty(filter))
{
predicate = predicate.And(p => p.a.Contains(filter));
predicate = predicate.Or(p => p.b.Value.Contains(filter));
predicate = predicate.Or(p => p.c.Value.Contains(filter));
predicate = predicate.Or(p => p.d.Name.Contains(filter));
predicate = predicate.Or(p => p.e.Contains(filter));
}
// Get items depending on previous predicate
var items= (from item in _context.Items.AsExpandable()
select item).Where(predicate).Where(m => m.Active).ToList();
но когда я пытаюсь использовать
predicate = predicate.Or(p => p.someDate.ToShortDateString().Contains(filter));
потому что я не использую конкретную дату для сравнения, но неполную строку, такую как 8/1 или 08/01, может быть, просто 8 или, может быть, просто год, поэтому я не могу сделать операцию между датами.
и выкидывает эту ошибку.
LINQ to Entities does not recognize the method 'System.String ToShortDateString()' method, and this method cannot be translated into a store expression.
и я получил по этой ссылке, что его, потому что linq для сущностей не может разобрать дату и строку, потому что, если разные настройки культуры.
даже если бы я использовал ToString("d"), я бы не хотел начинать делать все это снова и снова.
так что вопрос
Кто-нибудь знает способ заставить конструктор предикатов работать с date.tostring(). Содержит ()????
1 ответ
ToShortDateString является конструкцией C#, и база данных не понимает ее. Просто сравните даты прямо в построителе предикатов.
//use some kind of operator. I chose ==.
//if you are passing a date as a string, you need to parse that date first, then do the comparison.
DateTime filterDate;
if(DateTime.TryParse(filter, out filterDate))
predicate = predicate.Or(p => p.someDate == filterDate);
//Why would you do the date conversion to a string and see if that date contains another string?