LINQ to SQL - объединение столбцов даты и времени в одно значение - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь перевести этот оператор 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 не поддерживается функцией date dateadd для типа данных date».Я предполагаю, что он недоволен вызовом DATEADD с миллисекундами.Есть ли способ исправить это?

Редактировать: обратите внимание, что оба session.Date и session.Time могут быть обнуляемыми.

1 Ответ

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

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

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)
};
...