LINQ to SQL - 将日期和时间列合并为一个值

LINQ to SQL - Combine date and time columns into a single value

我正在尝试将此 SQL 语句转换为 LINQ:

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

其中 sessiondateDATE 类型,sessiontimeTIME.

类型

我试过以下方法:

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

其中 tableDataContext 实例上的 GetTable<Session>() 调用的 return 值,Session class 映射 sessionidIduseridUserIdsessiondateDate(日期时间),以及 sessiontimeTime(时间跨度)。

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]

不幸的是,在尝试执行该语句时,它告诉我 "The datepart millisecond is not supported by date function dateadd for data type date." 我猜它对 DATEADD 毫秒调用不满意。有办法解决这个问题吗?

编辑: 注意 session.Datesession.Time 都可以为空。

那个不幸的数据结构使代码不幸丑陋:

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