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>) の型パラメーターが一致しないため失敗します。コンストラクターが見つからないため、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 Web サイトで必要な L2S テーブルから xls ファイルを出力します)。

于 2010-05-25T16:33:23.367 に答える