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();

CategoryID是一个int。)最后,ouch将用零填充(数据库中的每个类别一个零)。我在这个例子中使用了int和;ArrayList确切的类型无关紧要。重复这种现象需要的要点是:

  1. LINQ2SQL。使用本地数据源将产生预期的强制转换异常
  2. select在表达式中使用查询的数据库表的属性。如果没有使用查询表的列,则会引发强制转换异常。

我的问题是,为什么上面的代码没有产生异常,试图ArrayListint?

根据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 回答