トラブルシューティング (LINQ to SQL)
更新 : November 2007
ここでは、LINQ to SQL アプリケーションで発生する可能性のある問題をいくつか示し、そうした問題を回避または影響を軽減するための提案を示します。
その他の問題については、「よく寄せられる質問 (LINQ to SQL)」を参照してください。
サポートされない標準クエリ演算子
LINQ to SQL は、すべての標準クエリ演算子メソッド (たとえば ElementAt<TSource>) をサポートするわけではありません。このため、コンパイルできたプロジェクトでも、ランタイム エラーが発生する可能性があります。詳細については、「標準クエリ演算子の変換 (LINQ to SQL)」を参照してください。
メモリの問題
クエリにメモリ内コレクションと LINQ to SQL の Table<TEntity> が含まれる場合、2 つのコレクションの指定順序に応じて、メモリ内でクエリが実行される可能性があります。クエリをメモリ内で実行する必要がある場合、データベース テーブルのデータを取得する必要があります。
この手法は非効率的で、メモリとプロセッサの消費量が非常に大きくなる可能性があります。このような複数ドメインのクエリはできる限り使用しないでください。
ファイル名と SQLMetal
入力ファイル名を指定するには、コマンド ラインで名前を入力ファイルとして追加します。(/conn オプションを使用して) 接続文字列にファイル名を含める操作は、サポートされていません。詳細については、「コード生成ツール (SqlMetal.exe)」を参照してください。
クラス ライブラリ プロジェクト
オブジェクト リレーショナル デザイナは、プロジェクトの app.config ファイルの中に接続文字列を作成します。クラス ライブラリ プロジェクトでは app.config ファイルは使用されません。LINQ to SQL は、デザイン時のファイルで提供される接続文字列を使用します。app.config 内の値を変更しても、アプリケーションの接続先データベースは変更されません。
連鎖削除
LINQ to SQL は連鎖削除操作をサポートせず、認識もしません。制約を持つテーブルの行を削除するには、次のいずれかを行う必要があります。
データベース内の外部キー制約で ON DELETE CASCADE 規則を設定する。
独自のコードを使用して、親オブジェクトの削除を妨げる子オブジェクトを最初に削除する。
このような操作を行わない場合、SqlException 例外がスローされます。
詳細については、「方法 : 行をデータベースから削除する (LINQ to SQL)」を参照してください。
クエリ可能でない式
「'型' の式はクエリ不可能です。LINQ プロバイダに対してアセンブリ参照や名前空間インポートが不足していないことを確認してください」というエラーが発生した場合、次の点を確認してください。
アプリケーションが .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 にマップされる複数のオペランドを連結する操作はサポートされません。異なる 2 つの型のセットにマップされる文字列を連結しようとすると、例外がスローされます。詳細については、「System.String メソッド (LINQ to SQL)」を参照してください。
SQL Server 2000 の Skip 例外と Take 例外
SQL Server 2000 データベースに対して Take<TSource> または Skip<TSource> を使用する際には、ID メンバ (IsPrimaryKey) を使用する必要があります。クエリは、(結合ではなく) 1 つのテーブルに対して実行されるか、Distinct、Except、Intersect、または Union 操作である必要があります。さらに、クエリに Concat<TSource> 操作を含めることはできません。詳細については、「標準クエリ演算子の変換 (LINQ to SQL)」の「SQL Server 2000 のサポート」を参照してください。
この要件は SQL Server 2005 には適用されません。
GroupBy InvalidOperationException
この例外は、たとえば group x by (Phone==@phone) のように、boolean 式でグループ分けする GroupBy クエリ内の列値が null である場合にスローされます。式が boolean であるため、キーは nullableboolean ではなく、boolean と推論されます。変換された比較で null が生成される場合、nullableboolean を boolean に割り当てようとして、例外がスローされます。
この状態を回避する (null を false と扱う) には、次のような手法を使用してください。
GroupBy="(Phone != null) && (Phone=@Phone)"
OnCreated() 部分メソッド
オブジェクト コンストラクタが呼び出されるたびに、生成されたメソッド OnCreated() が呼び出されます。これは、元の値をコピーするために LINQ to SQL がコンストラクタを呼び出す場合にも当てはまります。独自の部分クラスに OnCreated() メソッドを実装する場合には、この動作を考慮に入れてください。