我在使用 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
确切的类型无关紧要。重复这种现象需要的要点是:
- 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 连接而不是本地数据源时才会发生这种情况。试图了解这种行为的原因导致我找到了上面发布的代码。