ElenaRez Ответов: 2

Проблема в groupby год и месяц в запросе linq


Привет. Я внедряю asp.net ядро 3.1. у меня есть столбец в SQLServer под названием ApiRequestDate, который имеет тип nvarchar, а в моей модели-тип string. Данные хранятся в этом столбце в формате гггг/ММ/ДД. Теперь я хочу сгруппироваться по годам и месяцам, чтобы найти некоторые связанные данные за это время. Для этого я написал запрос, подобный следующему:

var total = from t1 in _context.Apiapp
                        let tg = new
                        {
                            t1.ApiRequestDate.Value.Year,
                            t1.ApiRequestDate.Value.Month
                        }
                        group tg by new { t1.ApiRequestDate.Value.Year, t1.ApiRequestDate.Value.Month }  into newGroup
                        Select new
                        {
                            Month = newGroup.Select(n => n.ApiRequestDate.Value.Month).First(),
                            ReqPerMonthCount = newGroup.Count()
                        };

            var totalCount = total.ToList();


Но он не работает, и в нем есть ошибки. Одна из ошибок - "значение" неизвестно. А во-вторых, имя Select не существует в текущем контексте.
Я буду признателен, если кто-нибудь предложит мне решение этой проблемы.

Что я уже пробовал:

ВАР = с Т1 в _context.Благодаря
пусть тг = новый
{
t1.ApiRequestDate.Ценность.Год,
t1.ApiRequestDate.Ценность.Месяц
}
сгруппируйте tg по новому { t1.ApiRequestDate.Ценность.Год, t1.ApiRequestDate.Ценность.Месяц } в новую группу
Выберите новый
{
Месяц = новая группа.Выберите(n => n.ApiRequestDate.Ценность.Месяц).Первый(),
ReqPerMonthCount = newGroup.Рассчитывать()
};

ВАР отображаются = итого.Список();

F-ES Sitecore

".Значение" распространяется только на типы, допускающие значение null, поэтому вероятность того, что ApiRequestDate представляет собой обычную строку, а не значение null, так что вы ссылки то прямые. Однако у него не будет свойства Year, так как это не дата, а строка. Я не уверен, сколько преобразования из строки в даты вы можете сделать в запросе linq, но, безусловно, лучшее решение публикуется как #1 - Если ваш столбец содержит дату, то сделайте его типом даты, и многие из ваших проблем исчезнут, а производительность тоже увеличится.

2 Ответов

Рейтинг:
1

phil.o

Именно поэтому вы должны использовать правильный тип данных в своей базе данных в первую очередь. Если вы настроите свой столбец с соответствующим типом данных DateTime и используете сопоставление .NET type, то ваш запрос становится тривиальным, потому что вы можете воспользоваться всеми свойствами, методами и операторами типа DateTime.

Как правило, единственное место, где вам нужна строка для представления значения datetime, - это когда вы хотите представьте конечному пользователю эту ценность Все, что было до этого шага, вообще не должно касаться какой-либо струны.


MadMyche

+5 у нас есть победитель.

Рейтинг:
1

MadMyche

Проблема очевидна; и именно такова Фил.о заявлено: неверный ввод данных как в вашей базе данных, так и в вашей модели.
Единственное допустимое исправление для этого-исправить это.

А теперь, тем временем, вы могли бы наложить на это несколько повязок. Моей первой мыслью было бы добавить еще одну собственность к вашей модели, которая определяется как get разобранные значение datetime, анализируются существующие ApiRequestDate собственность

значение datetime.Метод ParseExact (System) | Microsoft Docs[^]