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

这似乎解决了我的主要问题::

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 回答
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 回答