2012-11-27 27 views
0

的SQL Server CE 3.5
SQL Server 2008的
實體框架,DATALENGTH,在不同的供應商SUM

DataLenSumQuery:

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

在SQL Server CE的Data列的類型是IMAGE

在SQL Server Standard上,Data的類型爲varbinary(MAX),因爲微軟表示標準版的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; 
} 

但拋出異常的標準:

從物化 'System.Int64' 類型指定的強制轉換到 可爲空「 System.Int32'類型無效。

工作正常,如果Data式柱在兩個提供商是IMAGE和<int?>ExecuteStoreQuery被使用。

微軟建議遷移到Standard上的varbinary(MAX),但Compact Edition甚至不支持它。

+0

如果你要使用的數據庫的特定查詢,那麼你需要發送具體工作的數據庫查詢。 Sql CE和您碰到的Sql Server之間的區別與實體框架無關。然而,你可以做的是使用一個存儲過程來隱藏你的代碼的差異,或者只是把結果放在你的查詢中,這樣它總是返回bigint,因此當使用long作爲泛型時,EF不會拋出。 – Pawel

回答

0

SELECT CAST(SUM(DATALENGTH(數據))AS BIGINT)FROM

container.ExecuteStoreQuery<long?>()