При преобразовании номера месяца в строку ошибка : не распознает метод ‘System.String toString(Int32)’

#c# #entity-framework

#c# #entity-framework

Вопрос:

попытка выбрать отдельные месяцы в числовой форме из базы данных, где есть запись этого месяца в базе данных.

         public IEnumerable<months> dropdownMonths(datafilter dataparams)
    {
        try
        {
            var _dbEntity = new VXI_GLOBALiTRACKEntities();
            var unique_months =
                _dbEntity
                    .TBL_REQUEST
                    .Select(s => new months
                    {
                        value = s.REQUEST_DATE_SUBMITTED.Value.Month,
                        yr = s.REQUEST_DATE_SUBMITTED.Value.Year,
                        month = Convert.ToString(s.REQUEST_DATE_SUBMITTED.Value.Month)

                    })
                    .Distinct()
                    .Where(s => s.yr == dataparams.year)
                    .ToList();

            return unique_months;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
  

теперь на month = Convert.ToString(s.REQUEST_DATE_SUBMITTED.Value.Month)

он выдает ошибку

LINQ to Entities does not recognize the method 'System.String ToString(Int32)' method, and this method cannot be translated into a store expression.

как я могу это исправить или как я могу преобразовать номер этого месяца в строку месяца, например {value: 1, month: JAN}

Ответ №1:

Проверьте версию вашей СУБД и версию EF, поддерживают ли они DATEPART метод

например

на сервере sqlserver 2017 есть таблица, подобная приведенной ниже

 CREATE TABLE [Table1](
    [col_datetime] [datetime] NULL
);

insert into [Table1] 
select '2019/01/02 03:04:05'
  

затем запрос ef

 Table1s.Select(w => new { month = Convert.ToString(w.Col_datetime.Value.Month)})
  

он будет запрашивать ниже sql

 SELECT CONVERT(NVarChar,DATEPART(Month, [t0].[col_datetime])) AS [month]
FROM [Table1] AS [t0]
  

если он не поддерживается, он получит сообщение об ошибке LINQ to Entities does not recognize the method 'System.String ToString(Int32)' method, and this method cannot be translated into a store expression.

если вам необходимо сделать это без функции поддержки, вы можете сначала сохранить данные в памяти, а затем выбрать

 Table1s.Where(w=>/*your filter logic*/).ToList().Select(w => new { month = Convert.ToString(w.Col_datetime.Value.Month)})
  

Комментарии:

1. является ли ToList затем Выберите также получить ошибку? какая у вас версия СУБД и ef?

Ответ №2:

Если REQUEST_DATE_SUBMITTED имеет тип DateTime в вашей сущности, то

 month = s.REQUEST_DATE_SUBMITTED.ToString().Substring(0, 3).ToUpper()
  

месяц = «ЯНВАРЬ»

Если вы не получаете результат, посмотрите, соответствует ли ваш столбец в таблице

datetime или smalldate

если это не так, измените его на datetime

Комментарии:

1. s.REQUEST_DATE_SUBMITTED равно 1. теперь мне нужно преобразовать его в JAN