2009-06-11 16 views
1

に送信されるように取得します。次のようなものがあります:は、LINQのテーブルを動的に私は手順を持っている方法

protected void Page_Load(object sender, EventArgs e) 
{ 
    something(Linq.Products); 
} 

public void something(Object MyObject) 
{ 
    System.Data.Linq.Table<Product> Dynamic = 
     (System.Data.Linq.Table<Product>)MyObject; 
    var Edit = (from R in Dynamic 
       where R.ID == RecordID 
       select R).Single(); 

私の問題は、「何か」メソッドがどのテーブルに送られたのかを知ることができないことです。だから、静的な行:LINQのは、ちょうど私の手を静的にコード化されただけのようなコードを実行できるように<T>がダイナミックキャッチされた状態で、すべての変数をSystem.Data.Linq.Table<T> Dynamic = (System.Data.Linq.Table<T>)MyObject;

System.Data.Linq.Table<Product> Dynamic = (System.Data.Linq.Table<Product>)MyObject;のような何かを反映しなければならないでしょう。私はこれで私の髪を引っ張ってきました。助けてください。

答えて

0

あなたのコードはあまり意味がありません。あなたは「何か」を受け取ったり、「何か」の方法に送ることを試みていますか?

実際のコードの一部を投稿することができますか?

+0

私は統合コードを持っていません、今私はコンセプトを働いています。これは動作します: protected void Page_Load(オブジェクト送信者、EventArgs e) { 何か(Linq.Products); }公共ボイド何か(オブジェクトMyObjectに) {System.Data.Linq.Table 動的=(System.Data.Linq.Table )MyObjectに。 var Edit =(ダイナミックのRから R.ID == RecordID Rを選択).Single(); } –

+0

申し訳ありません...質問の通常の回答 –

0

私は統合されたコードを持っていません。なぜなら今は私がコンセプトを働いているからです。これは動作します:

protected void Page_Load(object sender, EventArgs e) 
    { 
     something(Linq.Products); 
    } 

    public void something(Object MyObject) 
    { 
     System.Data.Linq.Table<Product> Dynamic = (System.Data.Linq.Table<Product>)MyObject; 
     var Edit = (from R in Dynamic 
        where R.ID == RecordID 
        select R).Single(); 

    } 

これはしません:

protected void Page_Load(object sender, EventArgs e) 
    { 
     something(Linq.AnotherTable); 
    } 

    public void something(Object MyObject) 
    { 
     System.Data.Linq.Table<Product> Dynamic = (System.Data.Linq.Table<Product>)MyObject; 
     var Edit = (from R in Dynamic 
        where R.ID == RecordID 
        select R).Single(); 

    } 

これは動作します:

protected void Page_Load(object sender, EventArgs e) 
    { 
     something(Linq.AnotherTable); 
    } 

    public void something(Object MyObject) 
    { 
     System.Data.Linq.Table<AnotherTable> Dynamic = (System.Data.Linq.Table<AnotherTable>)MyObject; 
     var Edit = (from R in Dynamic 
        where R.ID == RecordID 
        select R).Single(); 

    } 

あなたが気付いしかしあれば、私は何のテーブルを定義する必要が私の "何か" の方法で私が探しているのは、問題が自分の「何か」のメソッドであるときに、私の大きなコードでこの機能を使用できない場合です。

+0

を試してみましょう!私はキャストを更新するのを忘れました。 System.Data.Linq.Table Dynamic =(System.Data.Linq.Table )MyObject; 読み取る必要があります。 System.Data.Linq.Table Dynamic =(System.Data.Linq.Table )MyObject; –

0

[OK]を今すぐあなたの質問に答えることができると思います。問題を解決するには、メソッド呼び出しでジェネリック型を定義し、メソッド本体の特定の型にジェネリック型を代入します。

public void something<T>(T MyObject) 
    { 
     System.Data.Linq.Table<T> Dynamic = (System.Data.Linq.Table<T>)MyObject; 
     var Edit = (from R in Dynamic 
        where R.ID == RecordID 
        select R).Single(); 

    } 

今、あなたはこのようにそれを呼び出すことができます。

something<Product>(Linq.Products); 

またはこのよう:

something<AnotherTableType>(Linq.AnotherTable); 
+0

しかし、私のコードにソリューションを配置すると、コンセプトが健全に見えます。System.Data.Linq.Tableにエラーが発生します。 Dynamic =(System.Data.Linq.Table )MyObject; と R.ID ソリューションを機能させるために特別なものを継承する必要がありますか? –

0

私はロバート・ハーヴェイとコメントして、回答を参照してください。 「私は必要ですかソリューションが動作するために特別なものを継承するのか?」

ジェネリック型(T)を使用しているため、ジェネリック型を何かに制約する必要があります。そうでなければTは何でもかまいません(オブジェクト、int、文字列、製品など)。

pulbic interface IEntity 
{ 
    Object Id { set; get; } 
} 

は、だからあなたのテーブルオブジェクト(エンティティ)がIEntityから継承する必要があり、その後、あなたのコードは次のようになります:

だから、理想的には、基本型またはインタフェース、すなわちを持っているだろう

protected void Page_Load(object sender, EventArgs e) 
{ 
    something(Linq.AnotherTable); 
} 

public void something<T>(System.Data.Linq.Table<T> MyObject) 
    where T : IEntity 
{ 
    var Edit = (from R in MyObject 
       where R.ID == RecordID 
       select R).Single(); 
} 

AnotherTableテーブルがIEntityから継承されている限り、somethingメソッドはあなたのためにTを推論します。

次の問題は、「Id」がオブジェクトタイプのものであること、またはそのタイプを希望するタイプであることですが、固定タイプです。だからあなたはもう一度問題を抱えています。異なるIDタイプを持っているとどうなりますか?だからではなく、オブジェクトの、またはあなたが(例えばint型、文字列、GUID)することを指定しているものは何でも、あなたはジェネリック型と可能な解決策をプロパティとして「キー」を使用することがあり、次のようになります。

pulbic interface IEntity<TKey> 
{ 
    TKey Key { set; get; } 
} 

これはより柔軟になりますが、もっと複雑になります...

関連する問題