EF Core — Исключить из IQueryable, если значение Datetime находится между 2 датами из списка

#c# #entity-framework #datetime

Вопрос:

В настоящее время я пытаюсь достичь следующего :

У меня есть IQueryable (UserDataDateRange), который имеет значения даты и времени «от» и «до», и еще один более крупный IQueryable (данные пользователя) со значением даты и времени, и в основном я хочу исключить все данные из данных пользователя, значение даты и времени находится между «от» и «до», сравнивая его с каждой записью UserDataDateRange. Кроме того, каждая дата-время может быть аннулирована, и я просто хочу их игнорировать.

Вот что я попробовал :

 private IQueryable<Userdata> ExcludeIfInDaterange(IQueryable<Userdata> query)
{
    var dateRangeQuery = DBContext.UserDateDateRange.Where(x => x.From.HasValue amp;amp; x.To.HasValue);
    query = query.Where(l => !l.UserDate.HasValue);
    foreach (var q in dateRangeQuery)
    {     
        query = query.Where(l => l.UserDate.Value <= q.From.Value amp;amp; l.UserDate.Value >= q.To.Value);
    }
    return query;
}
 

Насколько я понимаю, это должно сработать? Кроме того, я старался избегать использования чего-то вроде «toArray», потому что, насколько я понимаю, IQueryable-это в основном SQL, которым я манипулирую, и что-то, что дает мне фактические данные.
Однако я действительно не знаю, что я делаю не так, реального исключения нет, я просто получаю следующую ошибку :

Не удалось получить функцию из кадра. Код недоступен. Код ошибки-CORDBG_E_CODE_NOT_AVAILABLE или 0x80131309.

Моя функция, похоже, нарушает запрос, но я не могу понять, почему. Я даже не могу использовать «Count()», это дает мне ту же ошибку.

У кого-нибудь есть идея?

Ответ №1:

 l.UserDate.Value <= q.From.Value amp;amp; l.UserDate.Value >= q.To.Value
 

Как может дата быть одновременно и раньше, From и позже To даты? Если в вашей UserDateDateRange таблице нет очень странных данных, этот фильтр исключит все записи.

Вы также объединяете два взаимоисключающих фильтра с AND оператором, что является еще одним способом исключения всех записей:

  • !l.UserDate.HasValue : UserDate есть NULL
  • l.UserDate.Value <= ... : Не может быть удовлетворен, так UserDate как это NULL

И нет необходимости использовать .Value при сравнении свойств, допускающих обнуление, с < / <= / > / >= .

Попробуйте что-нибудь вроде:

 private IQueryable<Userdata> ExcludeIfInDaterange(IQueryable<Userdata> query)
{
    var dateRangeQuery = DBContext.UserDateDateRange.Where(x => x.From.HasValue amp;amp; x.To.HasValue);
    return query.Where(l => !l.UserDate.HasValue || !dateRangeQuery.Any(q => q.From <= l.UserDate amp;amp; l.UserDate <= q.To));
}