1

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

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

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

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

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

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

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

谢谢

雷比

更新:

该错误现已报告给 MS。更多细节在这里。谢谢马克!

4

2 回答 2

2

确认的。对我来说看起来像一个错误;你应该登录Connect。该团队正在修复 LINQ-to-SQL 错误,因此它可能不会被忽略。现在,使用.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.*/
}
于 2009-03-27T11:46:30.847 回答
0

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

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

于 2010-05-25T16:33:23.367 回答