不同提供商的实体框架,DATALENGTH,SUM

时间:2012-11-27 02:56:17

标签: sql sql-server entity-framework sql-server-ce-3.5

SQL Server CE 3.5
SQL Server 2008

DataLenSumQuery:

SELECT SUM(DATALENGTH(Data)) FROM ...

在SQL Server CE上,Data列的类型为IMAGE

在SQL Server Standard上,Data的类型为varbinary(MAX),因为Microsoft说标准版的IMAGE类型已弃用,将被删除。

此代码适用于标准版:

using (var container = new DatabaseModelContainer())
{
var result = container.ExecuteStoreQuery<long?>(DataLenSumQuery).FirstOrDefault();
            long test= result.HasValue ? result.Value : 0L;
}

但在CE上抛出异常:

  

System.InvalidOperationException:来自的指定强制转换   物化的'System.Int32'类型为可为空的'System.Int64'类型   无效。

反之亦然,这适用于CE:

using (var container = new DatabaseModelContainer())
{
var result = container.ExecuteStoreQuery<int?>(DataLenSumQuery).FirstOrDefault();
            long test= result.HasValue ? result.Value : 0L;
}

但是在Standard上抛出异常:

  

从物化的'System.Int64'类型到a的指定强制转换   可以为空的'System.Int32'类型无效。

如果两个提供商的Data列为IMAGE且<int?>使用ExecuteStoreQuery,则无效。

Microsoft建议在Standard上使用varbinary(MAX),但Compact版本甚至不支持它。

1 个答案:

答案 0 :(得分:0)

  

SELECT CAST(SUM(DATALENGTH(Data))AS BIGINT)FROM

container.ExecuteStoreQuery<long?>()