我有一个使用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。谢谢马克!
答案 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文件)。