我遇到了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
将填充零(数据库中每个类别为零)。我在此示例中使用了int
和ArrayList
;确切的类型是无关紧要的。重复这一现象所需的要点是:
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连接时才会发生这种情况,而不是它是本地数据源。试图理解这种行为的原因导致我上面发布的代码。
答案 0 :(得分:2)
答案 1 :(得分:0)
NorthwindDataContext db = new NorthwindDataContext();
IEnumerable<int> q =
from x in db.Categories
select x.CategoryID;
int[] ouch = q.ToArray();