1

実行するデータベースクエリのリストがあるアプリケーションがあります。

私は次のようなことをすることが可能であることを知っています:

var results = _db.Contacts.SqlQuery( sQuery );

のように:

var results = _db.Database.SqlQuery<Contacts>( sQuery );

しかし、私の状況では、メタデータのみを使用しています。どうすればこのようなことができますか?

string sBaseType = "Contacts";
var results = _db.Database.SqlQuery<sBaseType>( sQuery );

私はいくつかの成功を収めました<object>...それは私が期待したすべての行を返しましたが、それはあまり使いやすい形ではありませんでした。このさまざまな動的クエリを処理するための最良の方法は何ですか?

編集-私が見つけたいと思っているのは、次のようなメカニズムです。

var results = _db.Database[sBaseType].SqlQuery( sQuery );

次のような構造を避けることができるように:

if (sBaseType == "Contacts") {
    var results = _db.Contacts.SqlQuery( sQuery );
} else if  (sBaseType == "Buildings") {
    var results = _db.Buildings.SqlQuery( sQuery );
} else if  (sBaseType == "Rooms") {
    var results = _db.Rooms.SqlQuery( sQuery );
} else if  (sBaseType == "Equipment") {
    var results = _db.Equipment.SqlQuery( sQuery );
}

特に凝ったものは必要ありません...100以上の要素を構築するのを節約したいと思っていますif-elseifブロック...

4

2 に答える 2

1

ある種の型解​​決辞書を試すことができます。

public abstract class MetadataQuery
{
  public abstract string Type { get; }
  public abstract string QueryString { get; }
}

public class ContactsQuery : MetadataQuery
{
  public override string Type { get { return "Contact"; } }
  public override string QueryString { get { return "select * from Contacts where is_deleted = 0"; } }
}

タイプごとにクエリを記述します。

次に、タイプのリストをコンパイルします。ほとんどのIoCコンテナはこれを行うことができます。Ninjectを使用すると、次のようになります。そして、動的タイプはこれをはるかに簡単にします。

kernel.Bind<MetadataQuery>().To<ContactsQuery>();
// keep doing this for all of your metadata queries.

最後に、クエリを実際に使用する準備ができたら。

public class MyClass
{
  private readonly IDbConnection db;
  private readonly IDictionary<string, MetadataQuery> queries;

  public MyClass(IDbConnection db, IEnumerable<MetadataQuery> queries)
  {
    this.db = db;
    this.queries = queries.ToDictionary(q => q.Type);
  }

  public IEnumerable<dynamic> ExecuteSQL(string type)
  {
    var query = queries[type];
    var result = db.Query(query.QueryString);
    return result;
  }
}

どうしても非動的型が必要な場合は、MakeGenericTypeを調べる必要がありますそれはそれほど簡単ではありません。

于 2012-10-29T18:57:53.627 に答える
1

これは私の主な問題を解決するようです::

string sQuery = vo.objReport.sQuery;
object[] aParams = {} ;  //loaded through some other, related, process...

var tt = Type.GetType("MyProject.DAL." + vo.objReport.sBaseView);
var result =_db.Database.SqlQuery(tt, sQuery, aParams);

実行するクエリに関する一連のメタデータがあれば、クエリを実行して、使用可能な形式でデータを返すことができます。

于 2012-10-30T19:08:36.047 に答える