Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
.NET 4.x

Как в EF6.2 получить посредством LINQ записи для двух полей DateTime разница которых помещается в TimeSpan

17.03.2020, 15:24. Показов 737. Ответов 4

Студворк — интернет-сервис помощи студентам
в базе данных (MS SQL) есть таблица
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE [dbo].[JCResponse](
    [Id] [BIGINT] IDENTITY(1,1) NOT NULL,
    [IdInJCMessage] [BIGINT] NOT NULL,
    [GroupId] [BIGINT] NULL,
    [STATUS] [INT] NULL,
    [UserId] [BIGINT] NULL,
    [DateStatus] [datetime] NULL,
    [UserIdInit] [BIGINT] NULL,
    [DateCreate] [datetime] NULL,
    [Memo] [nvarchar](MAX) NULL,
    [RezervXML] [xml] NULL,
 CONSTRAINT [PK_JCResponse] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Есть класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    public class JResposeExpiredVM : JBoolSearchConditionBase
    {
        private int _days=0;
 
        public JResposeExpiredVM(int days = 14) 
                   : base(JournalType.ceh, string.Format("Имеющие просроченные (>{0} дней) отклики",days))
        {
            _days = days;
        }
 
        public override List<long> IdList()
        {
            
 
            List<long> list = new List<long>();
            TimeSpan? span = new TimeSpan(_days, 0, 0, 0);
            list= dBContext.JCResponse.Where(r => (
            ((((DateTime?)DateTime.Now - r.DateCreate) > span) && (r.Status == (int)JResponseState.WaitReview || r.Status == (int)JResponseState.ReviewInProcess))
            ||
            (((r.DateStatus - r.DateCreate) > span) && (r.Status == (int)JResponseState.ReviewRejected || r.Status == (int)JResponseState.ReviewSuccessfullyCompleted))
            )
            ).Select(o=>o.IdInJCMessage).Distinct().ToList();
 
            return list;
        }
    }
метод которого public override List<long> IdList() должен вернуть те записи у которых разница полей DateStatus и DateCreate должна попадать в заданный диапазон.
При выполнении EF выбрасывает исключение "Аргументы DbArithmeticExpression должны иметь общий числовой тип.". То есть я понимаю, что EF в linq запросе не может выполнить арифметические операции над DateTime.

Как мне обойти данную проблему и сделать выборку по диапазону дат?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2020, 15:24
Ответы с готовыми решениями:

Разница в работе LINQ EF6.2 в зависимости от режима совместимости базы данных
есть linq запрос к базе данных: var q = (from cr in dBContext.CheckRecords from u in...

Получить все четырёхзначные числа, в записи которых сумма двух левых цифр равна произведению двух правых
Добрый день! Задание: Получить все натуральные четырёхзначные числа, в записи которых сумма двух левых цифр равна произведению двух...

Получить тип вводимых значений в столбец таблицы посредством LINQ
Как узнать к какому типу по умолчанию принадлежат значения вводимые в определенный столбец. Например в базе данных создаем таблицу...

4
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
17.03.2020, 15:34
.. создайте сначала переменную TimeSpan interval, и подставьте в запрос interval.Days
0
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
17.03.2020, 16:15  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public override List<long> IdList()
        {
            
 
            List<long> list = new List<long>();
            TimeSpan span = new TimeSpan(_days, 0, 0, 0);
            
 
            list = dBContext.JCResponse.Where(r => (
            (((DateTime.Now - (DateTime)r.DateCreate).Days > span.Days) && (r.Status == (int)JResponseState.WaitReview || r.Status == (int)JResponseState.ReviewInProcess))
            ||
            ((((DateTime)r.DateStatus - (DateTime)r.DateCreate).Days > span.Days) && (r.Status == (int)JResponseState.ReviewRejected || r.Status == (int)JResponseState.ReviewSuccessfullyCompleted))
            )
            ).Select(o=>o.IdInJCMessage).Distinct().ToList();
 
            return list;
        }
Все тоже самое...
0
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
17.03.2020, 16:40
... гуголь и стэковер говорят, что можно использовать функцию SqlFunctions.DateDiff
Linq: Difference between 2 DateTimes in TimeSpan
1
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
17.03.2020, 18:22  [ТС]
все бы хорошо но Исключение.
Используемая версия SQL Server не поддерживает тип данных "time".

MS SQL 2005 древнее г...
Временный выход есть в том, чтоб
Цитата Сообщение от galeks1 Посмотреть сообщение
dBContext.JCResponse
полностью загрузить вначале с помощью ToList(). После этого linq уже работает не с EF и все замечательно получается.

Это работает пока записей мало, но если их вдруг будет за миллион...

Добавлено через 1 час 13 минут
Перенес базу данных на Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64)

Tакой вариант работает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 public override List<long> IdList()
        {
            List<long> list = new List<long>();
            /*TimeSpan span = new TimeSpan(_days, 0, 0, 0);
            list = dBContext.JCResponse.ToList().Where(r => (
            (((DateTime.Now - r.DateCreate) > span) && (r.Status == (int)JResponseState.WaitReview || r.Status == (int)JResponseState.ReviewInProcess))
            ||
            (((r.DateStatus - r.DateCreate) > span) && (r.Status == (int)JResponseState.ReviewRejected || r.Status == (int)JResponseState.ReviewSuccessfullyCompleted))
            )
            ).Select(r => r.IdInJCMessage).Distinct().ToList();
            */
            try
            {
                list = dBContext.JCResponse.Where(r => (
                (((SqlFunctions.DateDiff("second", r.DateCreate, DateTime.Now)) >= 86400 * _days) && (r.Status == (int)JResponseState.WaitReview || r.Status == (int)JResponseState.ReviewInProcess))
                ||
                (((SqlFunctions.DateDiff("second", r.DateCreate, r.DateStatus)) >= 86400 * _days) && (r.Status == (int)JResponseState.ReviewRejected || r.Status == (int)JResponseState.ReviewSuccessfullyCompleted))
                )
                ).Select(r => r.IdInJCMessage).Distinct().ToList();
            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message);
            }
 
            return list;
        }
спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2020, 18:22
Помогаю со студенческими работами здесь

TimeSpan сохранить в DateTime
Получив разницу двух дат в TimeSpan, пытаюсь сохранить ее в базу (SQLServer), единственный совместимый тип - DateTime. Стоит ли...

Получить n 4-значных чисел в записи которых нет двух одинаковых цифр
получить n 4-х значных чисел в записи которых нет 2 х одинаковых цифр

Получить n четырёхзначных чисел, в записи которых нет двух одинаковых цифр
условие задачи.. получить n четырёхзначных чисел, в записи которых нет двух одинаковых цифр. пробовал написать на с++ вот код: ...

Проблема с выбокой, Как получить темы для которых существуют записи в таблице Messages
Доброй ночи! Никак не могу сообразить как решить следующую задачу. Есть 2 таблицы Messages и Themes, соответственно у Messages есть...

Получить количество полей DateTime без времени
Здравствуйте. Есть таблица Table1. Два поля: ID (int) и dateDO (DateTime). Нужно получить количество записей в которых время в столбце...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru