简体   繁体   English

将linq2sql应用程序从SQL Server 2005升级到2008时出现SqlException

[英]SqlException when upgrading linq2sql app from SQL Server 2005 to 2008

I'm upgrading a web app from SQL Server 2005 to 2008. 我正在将Web应用程序从SQL Server 2005升级到2008。

For a query like: 对于像这样的查询:

(from e in context.Orders
group e by e.OrderDate.Value.Date.AddDays(-e.OrderDate.Value.Date.Day + 1) into g
orderby g.Count() descending
select new
{
Value = g.Count(),
Date = g.Key
}).FirstOrDefault().Dump();

I'm now getting "SqlException: The datepart millisecond is not supported by date function dateadd for data type date." 我现在得到“ SqlException:日期函数dateadd不支持数据类型为date的datepart毫秒”。

The page: http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/6b00d5a4-8b43-402a-bcf7-b8516b6ffdf5/ 页面: http : //social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/6b00d5a4-8b43-402a-bcf7-b8516b6ffdf5/

...describes the problem further but has no solution. ...进一步描述问题,但没有解决方案。

With 2005 provider linq2sql produces: 使用2005提供程序linq2sql可以产生:

-- Region Parameters
DECLARE @p0 Int SET @p0 = 1
-- EndRegion
SELECT TOP (1) [t2].[value2] AS [Value], [t2].[value3] AS [Date]
FROM (
    SELECT COUNT(*) AS [value], COUNT(*) AS [value2], [t1].[value] AS [value3]
    FROM (
        SELECT DATEADD(ms, (CONVERT(BigInt,(CONVERT(Float,(-DATEPART(Day, DATEADD(HOUR, -DATEPART(HOUR, [t0].[OrderDate]), DATEADD(MINUTE, -DATEPART(MINUTE, [t0].

[OrderDate]), DATEADD(SECOND, -DATEPART(SECOND, [t0].[OrderDate]), DATEADD(MILLISECOND, -DATEPART(MILLISECOND, [t0].[OrderDate]), [t0].[OrderDate])))))) + @p0)) * 

86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,(CONVERT(Float,(-DATEPART(Day, DATEADD(HOUR, -DATEPART(HOUR, [t0].[OrderDate]), DATEADD(MINUTE, -DATEPART

(MINUTE, [t0].[OrderDate]), DATEADD(SECOND, -DATEPART(SECOND, [t0].[OrderDate]), DATEADD(MILLISECOND, -DATEPART(MILLISECOND, [t0].[OrderDate]), [t0].

[OrderDate])))))) + @p0)) * 86400000)) / 86400000, DATEADD(HOUR, -DATEPART(HOUR, [t0].[OrderDate]), DATEADD(MINUTE, -DATEPART(MINUTE, [t0].[OrderDate]), DATEADD

(SECOND, -DATEPART(SECOND, [t0].[OrderDate]), DATEADD(MILLISECOND, -DATEPART(MILLISECOND, [t0].[OrderDate]), [t0].[OrderDate])))))) AS [value]
        FROM [Orders] AS [t0]
        ) AS [t1]
    GROUP BY [t1].[value]
    ) AS [t2]
ORDER BY [t2].[value] DESC

And on 2008: 而在2008年:

-- Region Parameters
DECLARE @p0 Int = 1
-- EndRegion
SELECT TOP (1) [t2].[value2] AS [Value], [t2].[value3] AS [Date]
FROM (
    SELECT COUNT(*) AS [value], COUNT(*) AS [value2], [t1].[value] AS [value3]
    FROM (
        SELECT DATEADD(ms, (CONVERT(BigInt,(CONVERT(Float,(-DATEPART(Day, CONVERT(DATE, [t0].[OrderDate]))) + @p0)) * 86400000)) % 86400000, DATEADD(day, (CONVERT

(BigInt,(CONVERT(Float,(-DATEPART(Day, CONVERT(DATE, [t0].[OrderDate]))) + @p0)) * 86400000)) / 86400000, CONVERT(DATE, [t0].[OrderDate]))) AS [value]
        FROM [Orders] AS [t0]
        ) AS [t1]
    GROUP BY [t1].[value]
    ) AS [t2]
ORDER BY [t2].[value] DESC

I found one workaround: 我找到了一种解决方法:

(from e in context.Orders
group e by new DateTime(e.OrderDate.Value.Year, e.OrderDate.Value.Month, 1) into g
orderby g.Count() descending
select new
{
    Value = g.Count(),
    Date = g.Key
}).FirstOrDefault();

But still interested in learning more about this problem. 但是仍然有兴趣了解有关此问题的更多信息。

I tried to change compatability more to Mysql Server 2008 but that didn't help the original query. 我试图将兼容性更多地更改为Mysql Server 2008,但这对原始查询没有帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM