Linq2SQL继承了类型和OfType查询

时间:2009-03-27 11:35:19

标签: c# linq-to-sql inheritance datasource oftype

我有一个使用Linq2SQL继承的设置。为了使查询更容易,我也在DataContext中公开派生类型,如下所示:

public IQueryable<Derived> Derivations 
{
  get { return Bases.OfType<Derived>(); } // filter list on type
}

调用此方法非常有效,我可以看到SQL正确生成。支持类型是DataQuery&lt; T&gt;。

当我将此IEnumerable分配给数据源(控件或BindingSource)时,会出现问题。

从我所看到的,查询DataQuery对象的IListSource。它很乐意提供这个。然后它继续制作BindingList,该BindingList作为所提供的2个参数的类型参数(IEnumerable&lt; Derived&gt;和Table&lt; Base&gt;)不匹配而失败。它引发了MissingMethod的一个例外,因为无法找到构造函数。

简单的解决方法是在IQueryable&lt; Derived&gt;上调用ToList()。在分配到数据源之前然后它可以工作,但这很累人。

有什么建议可以在不“失去”IQueryable的情况下处理这个问题吗?

由于

leppie

更新

现在已向MS报告该错误。更多细节here。谢谢马克!

2 个答案:

答案 0 :(得分:2)

确认。对我来说看起来像个错误;你应该在Connect登录。团队are fixing LINQ-to-SQL bugs,因此不会被忽略。现在,使用.ToList()等。

示例代码:

using (var ctx = new MyDataContext())
{
    var qry = ctx.BaseEntities.OfType<DerivedEntity>();
    IListSource ls = (IListSource)qry;
    IList list = ls.GetList(); // boom
    /* Constructor on type
       'System.Data.Linq.Provider.DataBindingList`1[snip]'
       not found.*/
}

答案 1 :(得分:0)

我有同样的问题(仍然没有固定的MS家伙!)。

为了保持IQueryable,我在分配数据源时做了.Cast<object>()(我使用它从DynamicData网站中我想要的任何L2S表输出xls文件)。