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();
(CategoryID
はint
.) 最後に、ouch
ゼロで埋められます (データベース内のカテゴリごとに 1 つのゼロ)。この例ではint
andを使用しました。ArrayList
正確なタイプは関係ありません。この現象を繰り返すために必要な主なポイントは次のとおりです。
- Linq2SQL。ローカル データ ソースを使用すると、予想されるキャスト例外が発生します
- クエリされたデータベース テーブルのプロパティを
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 接続の場合にのみ発生します。この動作の原因を理解しようとすると、上記のコードにたどり着きました。