Linq2SQL查询中无法进行强制转换

时间:2012-06-21 09:58:50

标签: c# .net linq linq-to-sql casting

我遇到了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将填充零(数据库中每个类别为零)。我在此示例中使用了intArrayList;确切的类型是无关紧要的。重复这一现象所需的要点是:

  1. LINQ2SQL。使用本地数据源将产生预期的强制转换异常
  2. select表达式中使用查询的数据库表的属性。如果未使用查询表的列,则将引发强制转换异常。
  3. 我的问题是,为什么上述代码不会产生异常,试图将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连接时才会发生这种情况,而不是它是本地数据源。试图理解这种行为的原因导致我上面发布的代码。

2 个答案:

答案 0 :(得分:2)

不会发生强制转换异常,因为强制转换被发送到数据库中,由.net之外的规则执行。

这与this method不抛出的原因相同。

这与查询中的字符串比较(默认情况下)不区分大小写的原因相同。

答案 1 :(得分:0)

NorthwindDataContext db = new NorthwindDataContext();
IEnumerable<int> q =
  from x in db.Categories
  select x.CategoryID;

int[] ouch = q.ToArray();