文字列クラス名に基づいてデータベースに動的にクエリを実行できるようにするコードの作成を検討しています。
私がここで欲しいものの簡単な概要:
私のコンテキスト:
public class MyContext : DbContext
{
public DbSet<Foo> Foos {get;set;}
public DbSet<Bar> Bars {get;set;}
}
私が持っているセットアップでは、基本的なことを行うことでこのコンテキストをクエリします。基本的context.Foos.Where(...)
に同じことをしたいと思いますが、コンパイル時にその部分を知る必要はなく、.Foos
実行時に行いたいと思います。
論理的に私が望むのは次のとおりです。
var results = context."ClassName".Where(...)
私は次のような一般的な方法でこれをやろうとしました:
//method in context
public IEnumerable<T> GetGenericData<T>() where T : Type
{
return context.Set<T>();
}
//call in repo
context.GetGenericData<Type.GetType("Foo")>();
ここで正しい道を進んでいるかどうかはわかりません。理想的には、SQL ルートを下る必要がないことを意味するソリューションを取得したい
編集:これにさらに取り組んでおり、この時点に到達しました。
//method in context
public DbSet GetGenericData(Type _type)
{
return context.Set(_type);
}
//calling like
var data = context.GetGenericData(myType);
問題は、これvar data
が DbSet であることです。これを、実行時に定義される Type のリストに変換できる必要があります。単純にできないので、これを行う簡単な解決策はありますかvar data = context.GetGenericData(myType).toList()
Edit2:問題にさらにコンテキストを追加するために、たとえば、ファイルからデータベーステーブルのリストを読み取り、これらのテーブルのデータを取得して、これを XML ファイルにシリアル化するコードを作成することを検討しています。
基本的に、次のようなファイルがあります。
Foo
Bar
MoreStuff
これが読み取られ、Foo テーブル内のすべてのデータが Foo.xml という xml ファイルにエクスポートされます。逆に、xml ファイルからデータを読み取り、データベースにインポートする必要もあります。