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