以下資訊揭露您在 LINQ 對 SQL 應用中可能遇到的一些問題,並提供避免或減輕這些問題影響的建議。
常見問題中會討論更多相關議題。
不支援的標準查詢運算元
LINQ 轉 SQL 並不支援所有標準查詢運算子方法(例如, ElementAt)。 因此,編譯的專案仍可能在執行時產生錯誤。 欲了解更多資訊,請參閱 標準查詢運算子翻譯。
記憶問題
若查詢涉及記憶體內集合與 LINQ 對 SQL Table<TEntity>的連結,則根據兩個集合的指定順序,查詢可能會在記憶體中執行。 如果查詢必須在記憶體中執行,則必須從資料庫資料表中取得資料。
此方法效率低,可能導致大量記憶體與處理器使用。 盡量避免這種多領域查詢。
檔案名稱與 SQLMetal
要指定輸入檔名,請將該名稱加入命令列作為輸入檔。 不支援在連接字串中包含檔名(使用 /conn 選項)。 欲了解更多資訊,請參閱 SqlMetal.exe(程式碼產生工具)。
班級圖書館專案
物件關聯設計器會在專案檔案中建立一個連接字串 app.config 。 在類別函式庫專案中,該 app.config 檔案不會被使用。 LINQ 轉 SQL 使用設計時檔案中提供的連接字串。 更改 的 app.config 值不會改變你的應用程式所連接的資料庫。
級聯刪除
LINQ 轉 SQL 不支援也不識別級聯刪除操作。 如果你想刪除有限制限制的資料表中的一列,你必須執行以下其中之一:
在資料庫的外鍵限制中設定規則
ON DELETE CASCADE。先用自己的程式碼刪除阻止父物件被刪除的子物件。
否則會拋出 SqlException 例外狀況。
欲了解更多資訊,請參閱 「如何:從資料庫中刪除資料列」。
表達式不可查詢
如果你遇到「Expression [expression] 不可查詢;你是不是漏掉了組裝參考?」錯誤,請確保以下內容:
你的應用程式目標是 .NET Compact Framework 3.5。
你有一個指向
System.Core.dll和System.Data.Linq.dll的參考。你有一個
Imports(Visual Basic)或using(C#)指令來對應 System.Linq 和 System.Data.Linq。
DuplicateKeyException
在除錯 LINQ to SQL 專案的過程中,你可能會遍歷一個實體的關聯。 這樣做會將這些項目帶入快取,LINQ to SQL 會察覺它們的存在。 如果你嘗試執行 Attach 或 InsertOnSubmit,或產生多個相同鍵的類似方法,就會拋出 DuplicateKeyException。
字串串接例外
不支援對映到 [n]text 和其他 [n][var]char 的運算元進行串接。 對於映射到兩組不同類型集合的字串串接,會拋出例外。 更多資訊請參見 System.String 方法。
在 SQL Server 2000 中跳過並取例外
使用 Take 或 Skip 針對 SQL Server 2000 資料庫時,必須使用 identity 成員(IsPrimaryKey)。 查詢必須針對單一資料表(即非連接),或為 Distinct、 、 ExceptIntersect或 Union 操作,且不得包含操作Concat。 欲了解更多資訊,請參閱 標準查詢運算子翻譯中的「SQL Server 2000 支援」章節。
此要求不適用於 SQL Server 2005。
GroupBy InvalidOperationException
當 GroupBy 查詢中,以表達 boolean 式進行分組且欄位值為空時會拋出此例外,例如, group x by (Phone==@phone)。 由於表達式為 boolean,故推論鍵為 boolean,而非 nullableboolean。 當翻譯後的比較產生空值時,會嘗試將 nullableboolean 指派到一個 boolean,並拋出異常。
為避免這種情況(假設你想將零值視為假),請採用以下方法:
GroupBy="(Phone != null) && (Phone=@Phone)"
OnCreated() 部分方法
每次呼叫物件建構子時都會呼叫產生的方法 OnCreated() ,包括 LINQ 轉 SQL 呼叫建構子以複製原始值的情況。 如果你在自己的部分類別中實作這個 OnCreated() 方法,請考慮這個行為。