Что такое правильное приведение даты и времени для QueryType в EFCore? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть представление в моей базе данных, которое я хочу прочитать с помощью EF Core.

Данные, которые я прочитал с помощью своего представления, представляют собой столбец int, который я могу преобразовать в правильную дату с помощью этого оператора SQL:

 CONVERT(NVARCHAR, DATEADD(MI, wf_activate, '1899-30-12'), 101) + ' ' + 
     CONVERT(NVARCHAR, DATEADD(MI, wf_activate, '1899-30-12'), 110) AS Start

Это будет правильно преобразовывать данные в:

12/17/2018 12-17-2018

Теперь я хочу получить доступ к моему представлению с EF Core 2.1 с этой моделью:

/// <summary>
/// Basis data from an ELO workflow.
/// </summary>
public class WorkflowStrangeUsersModel
{
    /// <summary>
    /// Gets or sets the workflow start date.
    /// </summary>
    public DateTime Start { get; set; }
}

иэтот контекст:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Query<WorkflowStrangeUsersModel>().ToView("INTRANET_WorkflowsStrangeUsers");
    }

, который работает со строками и int и т. д., но в этом случае datetime выдает ошибку:

Исключительная ситуация при чтении значения базы данных длясвойство 'WorkflowStrangeUsersModel.Start'.Ожидаемый тип был «System.DateTime», но фактическое значение имело тип «System.String».

Поэтому я предполагаю, что мое преобразование в 101/110 (формат даты США) неверно.Я пробовал также локальный формат (немецкий) и по умолчанию (0), но та же ошибка.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Может быть, вы можете получить дату как int, а затем преобразовать ее в Datetime, используя C #. Для этого вы можете использовать 2 свойства: StartInt и StartDate (одно из которых будет доступно только для чтения)

0 голосов
/ 17 июля 2019

Как подсказывает @ bradbury9, я бы изменил свое представление на

DATEADD(MI, wf_activate, '1899-30-12') AS Start

, из-за которого столбец datetime начинался бы уже при вызове базы данных.

С представлением в вашем вопросесначала вы получаете datetime из функции DATEADD, а затем используете CONVERT, чтобы превратить его в NVARCHAR (строку).

...