2009-03-27 15 views
1

私はLinq2SQL継承を使用した設定があります。Linq2SQL継承型とOfTypeクエリ

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

は完璧に動作し、私が正しく生成されたSQLを見ることができ、これを呼び出す:クエリを簡単にするために、私は次のように、同様のDataContextで派生型を公開します。バッキングタイプは、DataQuery <T>です。

このIEnumerableをデータソース(コントロールまたはBindingSource)に割り当てると問題が発生します。

私は、DataQueryオブジェクトがIListSourceのために照会されることを確認しました。そしてそれは喜んでこれを供給します。次に、2つの引数(IEnumerable <Derived>および表<Base>)の型パラメータとして失敗するBindingListを作成します。コンストラクタが見つからないため、MissingMethodの例外が発生します。

単純な回避策は、IQueryable <のToList()をデータソースに割り当てる前に呼び出すことですが、これはうまくいきますが、これは非常に疲れています。

IQueryableを「失う」ことなくこれを処理するための提案はありますか?

おかげ

leppie

UPDATE:

バグは今MSに報告されています。詳細はhereです。ありがとうMarc!

答えて

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.*/ 
} 
+0

ありがとう:) Hehe、私はリフレクターを経由して長い調査ルートを取った:) – leppie

+0

@leppie - ああ、私はすでにそのようなバインディングが取るルートに痛いほどよく慣れています... –

0

を私は同じ問題が(まだMSの連中を固定していない!)でした。

IQueryableを保持するには、.Cast<object>()をデータソースに割り当てるときに(私はDynamicData Webサイトで必要な任意のL2Sテーブルからxlsファイルを出力するために使用します)。