2011-08-10 12 views
1

私は、同じ基本クラスを継承する多くのLINQクラスを持っています。各Linqクラスには独自のテーブルがあり、基本クラスは別のテーブルへのリンクの一種です。関係を説明しようとします:C#Linqインターフェイスでの照会

//Base Class 
abstract class Element<T> 
{ 
    public string Name {get; set;} 
    public string Species {get; set;} 
} 

public partial class DogElement : Element<DogElement> 
{ 
    public int Legs {get; set;} 
    public bool hasHair {get; set;} 
} 

public partial class CatElement : Element<CatElement> 
{ 
    public bool hasWiskers {get; set} 
} 

だから、DogElementとCatElementは、データベース内の別々の物理テーブルです。 SpeciesクラスはSpeciesテーブルから読み込みます。私は基本的に、TテーブルをSpeciesテーブルでグループ化し、.Speciesを設定した後にTとして結果を返す、Elementのジェネリック関数を持っていたいと思います。

//Assume T is DogElement for this example 
public IQueryable<T> Collection 
{ 
    using (DataBase db = new DataBase()) 
    { 
    var k = from t in db.GetTable<T>() 
      where t.SomeID == SomeOtherID 
      select t; 

    k = { {Legs = 4, HasHair = True, Species = <null>, Name = <null>}, ...} 

    I basically want a query that will return an IQueryable<DogElement> with Name 
    and Species set from a join query. What is the best way to set the Name and 
    Species values? 

    return k; 
} 
+0

class抽象要素→抽象クラス要素 shenhengbin

答えて

-1

本質的には、継承を処理するようにSQLに依頼しています(そうしない)... LINQは継承もモデル化しません。良いオブジェクトリレーショナルマッパー(ORM)は、より包括的に何かをまとめるのに役立ちます。

これは簡単な説明です。

まず、各動物 - 動物ペアについて1つのLINQクエリを書く方が良いと思います。

LINQ selectを切り替えて新しい動物を作成し、その動物を一度に種にキャストして、LINQ文の外に出て、途中でTに再作成することができます。この種のステートメントは厄介です。

これは1つの大きなユニオンステートメントよりも効率的ではありませんが、これはより保守的なオプションと考えていますか?データベース(遅い)への2回の旅行をだが、それはより保守だ、と多くの場合、終わった最初のパスで、あなたのコードを最適化しない方がよい

var a from speciies select .. 

if(T is Dog){ 
    additional linq statement} 
else if(T is Cat){ 
    additional linq statement} 

+0

私はそれについて考えました、それは私の秋に戻ってくるだろう。私はこれを行うために滑らかなlinqの方法があると思っていた。 '(kから(sのdb.whateverの選択s)の結合hはk.IDの上のdb.hの結合h.IDとEの選択E).Cast ) ' – Cameron

+0

を動物 - 動物のペアとして使用し、typeof(T)に基づいて実行するものを選択します。それが私の好みのオプションです。いくつかの重なりがありますが、少なくとも基底クラスの部分は予測可能です。 – sgtz

+0

申し訳ありません。助けてくれてありがとう。 – Cameron

関連する問題