Построитель предикатов со сравнением даты и времени

Я только начинаю использовать 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?
Другие вопросы по тегам