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

时间:2012-01-11 10:22:45

标签: c# sql-server-2008 sql-server-2005 linq-to-sql

我正在将网络应用从SQL Server 2005升级到2008年。

对于像这样的查询:

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

我现在得到“SqlException:数据类型日期的日期函数dateadd不支持datepart毫秒。”

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

...进一步描述了问题,但没有解决方案。

使用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

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

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方法:

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

但仍然有兴趣了解这个问题。

我试图将兼容性更改为Mysql Server 2008,但这对原始查询没有帮助。