【问题标题】:Linq2SQL inherited types and OfType queryLinq2SQL 继承类型和 OfType 查询
【发布时间】:2009-03-27 11:35:18
【问题描述】:

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

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

调用它非常有效,我可以看到 SQL 正在正确生成。支持类型是 DataQuery

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

据我所知,已查询 DataQuery 对象以获取 IListSource。它很乐意提供这个。然后它继续创建一个 BindingList,由于提供的 2 个参数(IEnumerable 和 Table)的类型参数不匹配,该 BindingList 失败。由于找不到构造函数,它会引发 MissingMethod 异常。

简单的解决方法是在分配给数据源之前在 IQueryable 上调用 ToList(),然后它就可以工作了,但这很累。

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

谢谢

雷比

更新:

该错误现已报告给 MS。更多详情here。谢谢马克!

【问题讨论】:

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


    【解决方案1】:

    已确认。对我来说看起来像一个错误;你应该登录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.*/
    }
    

    【讨论】:

    • 谢谢 :) 呵呵,我通过 Reflector 走了很长的调查路线 :)
    • @leppie - 唉,我已经非常熟悉这种绑定所采用的路线了......
    【解决方案2】:

    我遇到了同样的问题(仍然没有解决 MS 的问题!)。

    为了保持 IQueryable 我在分配给数据源时做了一个.Cast&lt;object&gt;()(我用它从我想要在 DynamicData 网站中的任何 L2S 表中输出一个 xls 文件)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多