#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));
}