Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885

Как сделать запрос, так чтобы выборка проходила на стороне SQL сервера?

14.05.2017, 13:54. Показов 2031. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите переделать запрос, так чтобы не грузились все данные:
C#
1
2
3
4
5
6
    IAsyncEnumerable<MessageInfo> message = _context.MessageInfos.Where(mes => !mes.IsLine)
        .Include(c => c.Coordinates)
        .Include(d => d.DateAddObject)
 
        .ToAsyncEnumerable()
        .Where(d => d.DateAddObject.Date.Date == dateTime.Date);
Но как эту часть: .ToAsyncEnumerable().Where... переделать в запрос SQL?

Если сделаю так, то будет ошибка:
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
IQueryable<MessageInfo> message = _context.MessageInfos.Where(mes => !mes.IsLine)
    .Include(c => c.Coordinates)
    .Include(d => d.DateAddObject)
 
    .Where(d => d.DateAddObject.Date.Date == dateTime.Date);
 
if (message != null)
{
    List<HomeIndexViewModel> homeIndexViewModel = new List<HomeIndexViewModel>();
 
    await (message
    .AsNoTracking())
    .ForEachAsync(mes =>
    {
        if (mes != null)
            homeIndexViewModel.Add(new HomeIndexViewModel
            {
                MarkerMessageId = mes.MessageInfoId,
                Latitude = mes.Coordinates.First().Latitude,
                Longitude = mes.Coordinates.First().Longitude,
                Title = mes.Title
            });
    });
 
    return Json(homeIndexViewModel);
}
Текущий вариант
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
28
29
if (_context != null && DateTime.TryParse(date, out DateTime dateTime))
{
    IAsyncEnumerable<MessageInfo> message = _context.MessageInfos.Where(mes => !mes.IsLine)
        .Include(c => c.Coordinates)
        .Include(d => d.DateAddObject)
 
        .ToAsyncEnumerable()
        .Where(d => d.DateAddObject.Date.Date == dateTime.Date);
 
    if (message != null)
    {
        List<HomeIndexViewModel> homeIndexViewModel = new List<HomeIndexViewModel>();
 
        await (message)
            .ForEachAsync(mes =>
            {
                if (mes != null)
                    homeIndexViewModel.Add(new HomeIndexViewModel
                    {
                        MarkerMessageId = mes.MessageInfoId,
                        Latitude = mes.Coordinates.First().Latitude,
                        Longitude = mes.Coordinates.First().Longitude,
                        Title = mes.Title
                    });
            });
 
        return Json(homeIndexViewModel);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.05.2017, 13:54
Ответы с готовыми решениями:

Нужно сделать чтобы тексовый файл загрузился с сервера на стороне клиента
Ребят помогите проделать работу, сижу на экзамене выручайте! нужно сделать чтобы тексовый файл загрузился с сервера на стороне клиента. вот...

Как сделать так, чтобы картинки с сервера запрашавались но не отображались в браузере?
Интересная задача ) есть большой сайт, к примеру youtube.com открытие сайта через webbrowser потребляет много ресурсов, за счет...

Как сделать так, чтобы линия разрыва страницы НЕ ПРОХОДИЛА через объединенные ячейки?
Братья и сёстры, кто подскажет - как сделать так, чтобы линия разрыва страницы НЕ ПРОХОДИЛА через объединенные ячейки? Буду очень благодарен

4
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
14.05.2017, 17:31
Лучший ответ Сообщение было отмечено EveKS как решение

Решение

EveKS, Может проблема в Date.Date? Если же вдруг не работет все равно, можно попробовать так:
C#
1
2
3
4
5
var message = messageInfos.Where(mes => !mes.IsLine)
                                            .Include(c => c.Coordinates)
                                            .Include(d => d.DateAddObject)
 
                                            .Where(d => DbFunctions.TruncateTime(d.DateAddObject) == dateTime.Date);
Или так:
C#
1
2
3
4
5
6
7
var message = messageInfos.Where(mes => !mes.IsLine)
                                            .Include(c => c.Coordinates)
                                            .Include(d => d.DateAddObject)
 
                                            .Where(d => d.DateAddObject.Year == dateTime.Year
                                                        && d.DateAddObject.Month == dateTime.Month
                                                        && d.DateAddObject.Day == dateTime.Day);
Если DateAddObject имеет свой кастомный тип, а не DateTime, возможно нужно еще повозиться.

Добавлено через 6 минут
Алсо, возвращается коллекция Messages, так что message != null всегда выполняется. Нужно тут тогда SingleOrDefault использовать вместо Where.

Добавлено через 3 минуты
Ну и напоследок, конвертацию лучше тоже производить в EF, тогда меньше нужно будет в память выгружать, и инклюды не нужны:
C#
1
2
3
4
5
6
7
8
9
10
var messages = messageInfos.Where(mes => !mes.IsLine && DbFunctions.TruncateTime(d.DateAddObject) == dateTime.Date)
var homeIndexViewModels = messages.Select(mes => new HomeIndexViewModel
{
    MarkerMessageId = mes.MessageInfoId,
    Latitude = mes.Coordinates.First().Latitude,
    Longitude = mes.Coordinates.First().Longitude,
    Title = mes.Title
}).ToArray();
if (homeIndexViewModels.Any())
   return Json(homeIndexViewModel);
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
14.05.2017, 19:14  [ТС]
Psilon, спасибо, опробовал 2 варианта(точнее второй):
Выдает:
C#
1
2
3
4
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[0]
      An unhandled exception has occurred while executing the request
System.ArgumentException: Property 'Int32 Year' is not defined for type 'System.Nullable`1[System.DateTime]'
Parameter name: property
dateTime не может быть null, т.к. if (DateTime.TryParse(data.Datapicker, out DateTime dateTime)) проходит, да и если меняю на локальный, всё работает.
А с DbFunctions, в Microsoft.EntityFrameworkCore; ее нет.

Посмотрел модель, там и правда нет атрибута на не null, подставил ? и в итоге:
C#
1
2
3
4
5
                if (DateTime.TryParse(data.Datapicker, out DateTime dateTime))
                {
                    DateTime? nulDate = dateTime;
                    message = message.Where(d => d.DateAddObject.Date.Value.Date == nulDate.Value.Date);
                }
Не знаю как сделать TryParse сразу в Nullable<DateTime>

Добавлено через 10 минут
Psilon, огромное спасибо, теперь всё выглядит так:
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
28
29
30
31
32
33
34
35
36
if (_context != null)
{
    IQueryable<MessageInfo> messages = _context.MessageInfos.Where(mes => !mes.IsLine)
        .Include(c => c.Coordinates)
        .Include(d => d.DateAddObject);
 
    if (DateTime.TryParse(data.Datapicker, out DateTime dateTime))
    {
        DateTime? nulDate = dateTime;
        messages = messages.Where(d => d.DateAddObject.Date.Value.Date == nulDate.Value.Date);
    }
    else if (DateTime.TryParse(data.DatapickerBegin, out DateTime beginDate) && DateTime.TryParse(data.DatapickerEnd, out DateTime endDate))
    {
        DateTime? begin = beginDate;
        DateTime? end = beginDate;
 
        messages = messages.Where(d => d.DateAddObject.Date.Value.Date >= begin.Value.Date
                                        && d.DateAddObject.Date.Value.Date <= end.Value.Date);
    }
 
    if (!string.IsNullOrWhiteSpace(data.GroupId))
    {
        messages = messages.Where(g => g.MarkerGroupId == data.GroupId);
    }
 
    var homeIndexViewModels = await messages.Select(mes => new HomeIndexViewModel
    {
        MarkerMessageId = mes.MessageInfoId,
        Latitude = mes.Coordinates.First().Latitude,
        Longitude = mes.Coordinates.First().Longitude,
        Title = mes.Title
    }).ToListAsync();
 
    if (homeIndexViewModels.Any())
        return Json(homeIndexViewModels);
}
И работает xD

Добавлено через 4 минуты
Ну и Datepicker, а не Datapicker

Добавлено через 8 минут

Не по теме:

Цитата Сообщение от EveKS Посмотреть сообщение
DateTime? begin = beginDate; DateTime? end = beginDate;
И это увидел :)

0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
14.05.2017, 20:22
Лучший ответ Сообщение было отмечено EveKS как решение

Решение

EveKS, Вот эта часть выглядит очень странно:
C#
1
DateTime? begin = beginDate;
Вы уверены, что это нужно? Потому что ошибка вроде про другое. Вот так вроде тоже работать должно
C#
1
2
3
4
    if (DateTime.TryParse(data.Datapicker, out DateTime dateTime))
    {
        messages = messages.Where(d => d.DateAddObject.Date.Value.Date == dateTime.Date);
    }
Добавлено через 4 минуты
И да, я уже говорил, инклюды по идее не нужны, потому что вы в итоге достаете данные уже сконверченные в нужный формат. Все это будет происходить в контескте и явный инклюд не нужен.
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
14.05.2017, 21:39  [ТС]
Psilon, Убрал Include и (DateTime?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.05.2017, 21:39
Помогаю со студенческими работами здесь

как сделать так чтобы при активном checkbox на базу данных выводило цифры через sql запрос
например при активном checkbox1 выводит на БД Access цифру 1. программу надо сделать и связать с Delphi. помогите пожалуйста заранее...

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

Как сделать чтобы анимация проходила плавно и быстро
И еще.Ось вращения надо сделать жирнее.

запрос-выборка: как сделать, чтобы выводились пустые значения?
есть БД. предположим в ней есть таблички &quot;Люди&quot;, &quot;Анкеты&quot;(их много, у каждой есть своё название, своё айди и т.д., в каждой энное...

Как сделать так, чтобы 2 сервера друг друга видели
всем привет, уважаемые форумчане! ситуация такова: ранее 2 сервера стояли в одном офисе. где-то полгода назад их разнесли по разным...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru