【问题标题】:How to create a fully dynamic linq query?如何创建一个完全动态的 linq 查询?
【发布时间】:2013-08-08 14:08:55
【问题描述】:

我需要构建大约 30 个不同的管理页面来从 30 个不同的表中添加/编辑/删除记录。我显然可以花时间创建 30 个唯一页面来查询每个表,但我很好奇是否有一种方法可以简单地创建一个查询单个动态 linq 查询的单个动态页面。然后,此 linq 查询返回指定表中的所有字段和记录。

我已经看到与这个 (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx) 类似的动态 linq 示例,但这仍然需要将表名硬编码到查询中。我想做一个与此类似的全选,我传入表的名称(即“产品”、“订单”等),然后以某种方式查询该表:

private List<tableName> MyDynamicQuery(string tableName)
 {
      IEnumerable<tableName> dynamicList;

      using (MyEntities db = _conn.GetContext())
      {
           dynamicList = (from q in db.<tableName>
                        select q).ToList();
      }
      return dynamicList;
 }

这样的事情有可能吗?

谢谢

【问题讨论】:

  • 您听说过动态数据框架,它可能对您有所帮助。
  • LINQ 不适合这种情况。考虑使用原始 DataReaders、微 ORM 或 DataTable
  • @SLaks 是对的。我也遇到过类似的情况,我即时构建 SQL 并使用 micro-orm(准确地说是 ServiceStack.OrmLite)来返回数据。
  • 如果您只有表名作为字符串,则没有真正的方法可以获得强类型的返回值。由于您在编译时不知道类型,即使您可以实现这样的方法,也永远无法调用它,除非您在编译时知道它的返回类型是什么。要么它需要返回一个非静态类型的结果(即 DataTable),要么你需要使用泛型以便调用者在编译时知道返回类型。
  • 因为标准不是动态的,我认为您应该通过在架构的 (.GetTableNames() 或其他东西中查找表名来进行。返回 List 怎么样?你不是说List 还是什么?

标签: c# asp.net linq


【解决方案1】:

你为什么不传入一个选择器而不是使用表名呢?它看起来像这样:

private List<T> GetData<T>(Func<MyEntities, IEnumerable<T>> selector)
{
    using (MyEntities db = _conn.GetContext())
    {
        return selector(db).ToList();
    }
}

你会这样使用它:

var orders = GetData(db => db.Orders);

【讨论】:

  • 您仍然需要提供表格的类型。我认为 OP 需要将表类型作为字符串。
  • 他似乎已经有了 EF 数据模型。如果是这种情况,编译器将为您推断结果的类型。
  • 我不关注你。你仍然需要传递一个IEnumerable&lt;T&gt;,那么你怎么能不把它变成一个对象或者有一个 30 长的 switch 语句呢?
  • 好吧,我想它需要一个 30 长的 switch 语句,您可以在其中为每种情况传递一个不同的 Func。但这听起来比尝试使用字符串创建完全动态的解决方案更简单(并且是强类型化的)。
【解决方案2】:

您可以使用实体框架并这样做:

dynamiclist = this.datacontext.Set<T>().ToList(); // where T is the Type, represents the table in EF

【讨论】:

    猜你喜欢
    • 2015-10-01
    • 2011-02-18
    • 1970-01-01
    • 2010-09-21
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多