C # Linq эквивалент для SQL-скрипта не отвечает - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть следующий SQL-скрипт, который работает нормально и довольно быстро:

select top 30 CONVERT(date, p.DateCreated) as Fecha,
(select count(*) from People d where d.recipientid = p.recipientid and d.SubscriptionType = 0 and CONVERT(date, p.DateCreated) = CONVERT(date, d.DateCreated)) as Subscribed
from People p
where p.RecipientId = '276643679047355'
group by CONVERT(date, p.DateCreated), p.RecipientId
order by CONVERT(date, p.DateCreated) desc;

Однако, когда я пытаюсь вызвать это из приложения C # с использованием LinQ, оно не отвечает должным образом (на самом деле, после ожидания 5 минут, я должен сказать, что он не отвечает вообще).Я придумал следующую команду LinQ, тем не менее, что-то должно быть не так, потому что она не отвечает так быстро, как предоставленный сценарий SQL:

            model = await _context.People
                .Where(x => x.RecipientId == recipientId && x.DateCreated > startDate && x.DateCreated < endDate)
                .Select(x => new { DateGrouped = x.DateCreated.ToString("yyyy-MM-dd"), x.RecipientId })
                .GroupBy(x => new { x.DateGrouped, x.RecipientId })
                .Select(a => new StatsViewModel
                {
                    DateStatsFormatted = a.Key.DateGrouped,
                    Subscribed = _context.People.Where(d => d.RecipientId == a.Key.RecipientId && d.SubscriptionType == SubscriptionType.Suscribed && d.DateCreated.ToString("yyyy-MM-dd") == a.Key.DateGrouped).Count()
                }
                )
                .ToListAsync();

Не могли бы вы помочь мне указать, что я делаюнеправильно или, по крайней мере, подсказать что искать?

1 Ответ

0 голосов
/ 19 февраля 2019

Ну, после долгого дня, пробующего разные подходы, я наконец понял это.Я не смог заставить работать свой профилировщик SQL, потому что моя база данных находится на Azure и, похоже, она не совместима.Форматирование даты тоже не было моим решением.Проблема была в моем вложенном запросе для свойства «Подписка» ... кажется, это создавало некую циклическую ссылку.Вот как это работает сейчас:

            model = await _context.People
                .Where(x => x.RecipientId == recipientId && x.DateCreated > startDate && x.DateCreated < endDate)
                .Select(x => new { DateGrouped = x.DateCreated.ToString("yyyy-MM-dd"), x.RecipientId, x.SubscriptionType })
                .GroupBy(x => new { x.DateGrouped, x.RecipientId })
                .Select(a => new StatsViewModel
                {
                    DateStatsFormatted = a.Key.DateGrouped,
                    Subscribed = a.Count(c=>c.SubscriptionType == SubscriptionType.Suscribed),
                    Unsubscribed = a.Count(c=>c.SubscriptionType == SubscriptionType.Unsuscribed),
                    NoSet = a.Count(c=>c.SubscriptionType == SubscriptionType.NoSet)
                }
                )
                .ToListAsync();

Обратите внимание, что я только добавил свойство «SubscriptionType» в мой основной выбор, чтобы позже использовать его в фильтрованном выборе как часть фильтраСвойство «Подписано» ... довольно просто, прямо и работает как шарм!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...