0

(この質問をここに再投稿することをお勧めします...最初はmsdnフォーラムに投稿されました)

私は、EF/Linq to Entities を使用していくつかの単純な CRUD 操作用の「汎用」ルーチンを作成しようとしています。ASP.NET (C# または VB) で作業しています。

私は見ました:

  1. 「GetObjectByKey」で動的に選択されたテーブルへの参照を取得します(ただし、キャッシュからは何も必要ありません。データベースからのデータが必要です。この関数が意図しているものではないようです)。

  2. CRM Dynamic Entities (ここではテーブル名の文字列をクエリに渡すことができます) は、私が探しているアプローチのように見えましたが、この CRM の取り組みが必ずしも最新の状態を維持している (?) および/または将来に向けて多くの保証があるとは思えません。 ??

  3. 名前空間/オブジェクトをドリルダウンして、よく使用されるクエリ構文 var query = (from c in context.C_Contacts select c); に TableName パラメータを渡すことができる場所にたどり着くさまざまな方法を調べました。(たとえば) 操作するテーブルに応じて、「C_Contacts」TEntity を交換することができます。しかし、これを行う方法が見つかりませんか??

少し単純化しすぎて、テーブル名パラメーターと、場合によっては関連するフィールド名と値 (おそらく汎用オブジェクト内) をルーチンに渡して、そのルーチンを LINQ to Entity データ コンテキストに動的にプラグインできるようにしたいだけです。モデル化して、パラメーター テーブルの標準的な「すべて選択」操作を実行するか、汎用レコード ID に基づいてパラメーター テーブルを削除します。テーブル名などに基づいて自動的に生成されたさまざまな異なる L2E メソッドを呼び出すことを避けようとしています...代わりに、データ コンテキストを掘り下げ、最終的に動的に渡されたテーブル/フィールド名の L2E クエリ構文を調べようとしています。

これを行うための成功した/効率的なアプローチを見つけた人はいますか? アイデア、リンク、例はありますか?

4

1 に答える 1

0

DbContext オブジェクトには、汎用の Set() メソッドがあります。これにより、

from c in context.Set<Contact>() select c

文字列から開始する場合のメソッドは次のとおりです。

public void Test()
{
    dynamic entity = null;
    Type type = Type.GetType("Contract");
    entity = Activator.CreateInstance(type);
    ProcessType(entity);
}

public void ProcessType<TEntity>(TEntity instance)
    where TEntity : class
{
    var result = 
        from item in this.Set<TEntity>()
        select item;

    //do stuff with the result
    //passing back to the caller can get more complicated
    //but passing it on will be fine ...
}
于 2013-02-24T18:57:56.197 に答える