共用方式為


疑難排解

下列資訊會公開一些您在 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.dllSystem.Data.Linq.dll 的參考。

  • 您具有 System.LinqSystem.Data.LinqImports (Visual Basic) 或 using (C#) 指示詞。

DuplicateKeyException

在偵錯 LINQ to SQL 專案時,您可能會周遊某個實體的關聯。 這麼做會將這些項目帶至快取,而且 LINQ to SQL 會感知這些項目的存在。 如果您接著嘗試執行 AttachInsertOnSubmit,或是類似方法來產生有相同索引鍵的多個資料列,就會擲回 DuplicateKeyException

字串串連例外狀況

串連對應到 [n]text 和其他 [n][var]char 的運算元是不支援的做法。 串連對應到兩組不同型別的字串時,會擲回例外狀況。 如需詳細資訊,請參閱 System.String 方法

SQL Server 2000 中的 Skip 和 Take 例外狀況

當您對 SQL Server 2000 資料庫使用 IsPrimaryKeyTake 時,必須使用識別成員 (Skip)。 此查詢必須針對單一資資料表 (即非聯結資料表) 執行,或為 DistinctExceptIntersectUnion 作業,而且不能包含 Concat 作業。 如需詳細資訊,請參閱標準查詢運算子轉譯中的<SQL Server 2000 支援>一節。

這項需求不適用於 SQL Server 2005。

GroupBy InvalidOperationException

當以 GroupBy 運算式做為群組依據 (例如 boolean) 的 group x by (Phone==@phone) 查詢有資料行的值為 null 時,會擲回此例外狀況。 由於運算式為 boolean,因此索引鍵會推斷為 boolean,而非 nullableboolean。 當轉譯後的比較產生 null 時,若嘗試將 nullableboolean 指派給 boolean,就會擲回此例外狀況。

為避免這個情況 (假設您要將 null 視為 false),請使用類似下列的方式:

GroupBy="(Phone != null) && (Phone=@Phone)"

OnCreated() 部分方法

每次呼叫物件建構函式時,都會呼叫產生的方法 OnCreated(),包括 LINQ to SQL 呼叫建構函式來複製原始值的情況。 如果您要在自己的部分類別中實作 OnCreated() 方法,請將此行為列入考量。

另請參閱