LINQ to SQL — объединение столбцов даты и времени в одно значение

Я пытаюсь перевести этот оператор SQL в LINQ:

SELECT sessionid, userid, CAST(sessiondate AS DATETIME) + CAST(sessiontime AS DATETIME) AS sessiondatetime FROM sometable

где sessiondate относится к типу DATE, а sessiontime относится к типу TIME.

Я пробовал следующее:

var query = from session in table
            select new
            {
              session.Id,
              session.UserId,
              DateTime = session.Date + session.Time
            };

где table — это возвращаемое значение вызова GetTable<Session>() для экземпляра DataContext, а класс Session сопоставляет sessionid с Id, userid с UserId, sessiondate с Date (DateTime) и sessiontime с Time (TimeSpan).

LINQ преобразуется в этот довольно длинный оператор SQL:

SELECT [t0].[sessionid] AS [Id], [t0].[userid] AS [UserId], CONVERT(DateTime,DATEADD(HOUR, DATEPART(HOUR, [t0].[sessiontime]), CONVERT(DateTime,DATEADD(MINUTE, DATEPART(MINUTE, [t0].[sessiontime]), CONVERT(DateTime,DATEADD(SECOND, DATEPART(SECOND, [t0].[sessiontime]), CONVERT(DateTime,DATEADD(MILLISECOND, DATEPART(MILLISECOND, [t0].[sessiontime]), [t0].[sessiondate])))))))) AS [DateTime] FROM [sometable] AS [t0]

К сожалению, при попытке выполнить этот оператор он сообщает мне, что «миллисекунда datepart не поддерживается функцией даты dateadd для даты типа данных». Я предполагаю, что он недоволен вызовом DATEADD с миллисекундами. Есть ли способ исправить это?

Изменить: обратите внимание, что и session.Date, и session.Time могут принимать значение NULL.


person Nicolas Gnyra    schedule 11.02.2019    source источник
comment
Вы пытаетесь суммировать значения столбцов sesstiondate и sessiontime или просто пытаетесь отформатировать их для совместного отображения?   -  person Mohsin Mehmood    schedule 12.02.2019
comment
Я пытаюсь суммировать и использовать их для сравнения позже.   -  person Nicolas Gnyra    schedule 12.02.2019


Ответы (1)


Эта неудачная структура данных делает код, к сожалению, уродливым:

var query = from session in table
select new
{
    session.id,
    session.userid,
    combinedDate = new DateTime(
        session.Date.Year, session.Date.Month, session.Date.Day, 
        session.Time.Hour, session.Time.Minute, session.Time.Second, 
        session.Time.Millisecond)
};
person matt-dot-net    schedule 11.02.2019
comment
Я совершенно забыл упомянуть, что использую значения, допускающие значение NULL, поэтому я работал с session.Date.Value и session.Time.Value, что не работает должным образом с этим ответом. Однако приведение к ненулевым типам вместо использования .Value работает отлично! Это далеко не самая красивая вещь, но она работает. - person Nicolas Gnyra; 12.02.2019