疑難排解
下列資訊會公開一些您在 LINQ to SQL 應用程式中可能遇到的問題,並提供建議來避免或降低這些問題的影響。
其他問題會在常見問題集中加以解決。
不支援的標準查詢運算子
LINQ to SQL 並不會支援所有標準查詢運算子方法 (例如,ElementAt)。 因此,專案即使可以編譯,仍可能產生執行階段錯誤。 如需詳細資訊,請參閱標準查詢運算子轉譯。
記憶體問題
如果查詢牽涉到記憶體中的集合和 LINQ to SQL Table<TEntity>,則查詢可能會在記憶體中執行,這會視指定這兩個集合的順序而定。 如果查詢必須在記憶體中執行,則必須擷取資料庫資料表中的資料。
這種方式沒有效率,而且可能會耗用大量的記憶體和處理器資源。 請盡量避免這種多重定義域查詢。
檔案名稱和 SQLMetal
若要指定輸入檔案名稱,請將名稱以輸入檔案加入命令列。 不支援將檔案名稱包含在連接字串中 (使用 /conn 選項)。 如需詳細資訊,請參閱 SqlMetal.exe (程式碼產生工具)。
類別庫專案
物件關聯式設計工具會在專案的 app.config
檔案中建立連接字串。 類別庫專案不使用 app.config
檔案。 LINQ to SQL 會使用設計階段檔案中提供的連接字串。 變更 app.config
中的值不會變更應用程式所連接的資料庫。
串聯刪除
LINQ to SQL 不支援或無法辨識串聯刪除作業。 如果您要刪除有條件約束之資料表中的資料列,必須執行下列其中一項工作:
在資料庫的外部索引鍵條件約束中設定
ON DELETE CASCADE
規則。使用您自己的程式碼,先刪除使父物件無法刪除的子物件。
否則會擲回 SqlException 例外狀況。
如需詳細資訊,請參閱作法:從資料庫中刪除資料列。
無法查詢運算式
如果您看到「運算式 [expression] 無法查詢;是否遺漏組件參考?」錯誤,請確定下列事項:
您的應用程式是以 .NET Compact Framework 3.5 為目標。
您有
System.Core.dll
和System.Data.Linq.dll
的參考。您具有 System.Linq 和 System.Data.Linq 的
Imports
(Visual Basic) 或using
(C#) 指示詞。
DuplicateKeyException
在偵錯 LINQ to SQL 專案時,您可能會周遊某個實體的關聯。 這麼做會將這些項目帶至快取,而且 LINQ to SQL 會感知這些項目的存在。 如果您接著嘗試執行 Attach 或 InsertOnSubmit,或是類似方法來產生有相同索引鍵的多個資料列,就會擲回 DuplicateKeyException。
字串串連例外狀況
串連對應到 [n]text
和其他 [n][var]char
的運算元是不支援的做法。 串連對應到兩組不同型別的字串時,會擲回例外狀況。 如需詳細資訊,請參閱 System.String 方法。
SQL Server 2000 中的 Skip 和 Take 例外狀況
當您對 SQL Server 2000 資料庫使用 IsPrimaryKey 或 Take 時,必須使用識別成員 (Skip)。 此查詢必須針對單一資資料表 (即非聯結資料表) 執行,或為 Distinct、Except、Intersect 或 Union 作業,而且不能包含 Concat 作業。 如需詳細資訊,請參閱標準查詢運算子轉譯中的<SQL Server 2000 支援>一節。
這項需求不適用於 SQL Server 2005。
GroupBy InvalidOperationException
當以 GroupBy 運算式做為群組依據 (例如 boolean
) 的 group x by (Phone==@phone)
查詢有資料行的值為 null 時,會擲回此例外狀況。 由於運算式為 boolean
,因此索引鍵會推斷為 boolean
,而非 nullable
boolean
。 當轉譯後的比較產生 null 時,若嘗試將 nullable
boolean
指派給 boolean
,就會擲回此例外狀況。
為避免這個情況 (假設您要將 null 視為 false),請使用類似下列的方式:
GroupBy="(Phone != null) && (Phone=@Phone)"
OnCreated() 部分方法
每次呼叫物件建構函式時,都會呼叫產生的方法 OnCreated()
,包括 LINQ to SQL 呼叫建構函式來複製原始值的情況。 如果您要在自己的部分類別中實作 OnCreated()
方法,請將此行為列入考量。