Я пытаюсь перевести этот оператор 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
могут быть обнуляемыми.