0

Linq2SQL クエリで問題が発生しました。問題のあるクエリを分析すると、この不可解な動作の最小限の例が得られます。

NorthwindDataContext db = 
  new NorthwindDataContext();
IEnumerable<int> q =
  from x in db.Categories
  select (int)(object)new System.Collections.ArrayList(x.CategoryID);
int[] ouch = q.ToArray();

(CategoryIDint.) 最後に、ouchゼロで埋められます (データベース内のカテゴリごとに 1 つのゼロ)。この例ではintandを使用しました。ArrayList正確なタイプは関係ありません。この現象を繰り返すために必要な主なポイントは次のとおりです。

  1. Linq2SQL。ローカル データ ソースを使用すると、予想されるキャスト例外が発生します
  2. クエリされたデータベース テーブルのプロパティをselect式で使用します。クエリされたテーブルの列が使用されていない場合、キャスト例外が発生します。

ArrayList私の質問は、上記のコードが を にキャストしようとして例外を生成しないのはなぜintですか?

LINQPad に従って生成された SQL コード:

SELECT NULL AS [EMPTY]
FROM [Categories] AS [t0]

私の質問の背景として: 私の元のコードは次のようになります:

IEnumerable<ParentClass> q =
  (from x in db.SomeTable
  select (ParentClass) new ChildClass { SomeProperty = x.SomeColumn })
  .ToArray();

ChildClassから継承しParentClassます。このコードは正しく型付けされていて意味的にも正しいですが、例外が発生します。これdbは、ローカル データ ソースではなく、Linq2SQL 接続の場合にのみ発生します。この動作の原因を理解しようとすると、上記のコードにたどり着きました。

4

2 に答える 2

2

キャストはデータベースに送信され、.net の外部のルールによって実行されるため、キャスト例外は発生しません。

このメソッドがスローしないのと同じ理由です。

クエリでの文字列比較が (デフォルトで) 大文字と小文字を区別しないのと同じ理由です。

于 2012-06-21T13:46:55.980 に答える
0
NorthwindDataContext db = new NorthwindDataContext();
IEnumerable<int> q =
  from x in db.Categories
  select x.CategoryID;

int[] ouch = q.ToArray();
于 2012-06-21T10:06:48.383 に答える