如何创建完全动态的LINQ查询?

9
我需要构建大约30个不同的管理页面,以从30个不同的表中添加/编辑/删除记录。 我可以花时间创建30个唯一的页面来查询每个表,但我想知道是否有一种方法可以简单地创建一个单一的动态页面,它查询单个动态linq查询。 然后,该linq查询从指定的表返回所有字段和记录。
我看过类似于这个动态linq的示例(http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx),但这仍然需要将表名硬编码到查询中。 我想做一个类似于这样的选择全部,其中我传递表的名称(即“Products”,“Orders”等),然后以某种方式查询该表:
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;
 }

这样的操作是否可能实现?

谢谢


你听说过动态数据框架吗?它可能会对你有所帮助。 - mipe34
2
LINQ 不适用于此。考虑使用原始的 DataReader、微型 ORM 或 DataTable - SLaks
@SLaks是正确的。我曾经遇到过类似的情况,我会动态构建SQL并使用微型ORM(具体来说是ServiceStack.OrmLite)返回数据。 - Moo-Juice
2
如果您只有表名作为字符串,那么就没有真正的方法可以获得强类型的返回值。由于您在编译时不知道类型,即使您可以实现这样的方法,除非您在编译时知道它的返回类型,否则您永远无法调用它。它需要返回一个非静态类型的结果(即DataTable),或者您需要使用泛型,以便调用者在编译时知道返回类型。 - Servy
因为条件不是动态的,所以我认为你应该通过在模式中查找表名(.GetTableNames() 或类似方法)来进行操作。那么返回 List<TableName> 怎么样?难道你的意思不是返回 List<DataRow> 或其他什么吗? - Jeroen van Langen
2个回答

3

为什么不使用选择器而不是表名呢?它看起来会像这样:

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需要将表类型作为字符串。 - gunr2171
他似乎已经有了一个 EF 数据模型。如果是这样,编译器将为你推断结果的类型。 - Abe Heidebrecht
我不明白你的意思。你仍然需要传递一个 IEnumerable<T>,那么如果不将其转换为对象或使用30行的switch语句,你该怎么做呢? - gunr2171
嗯,我想这需要一个30个长的switch语句,在每个情况下传递不同的“Func”。但是,这听起来比尝试使用字符串创建完全动态的解决方案要简单(并且强类型)。 - Abe Heidebrecht

2

您可以使用实体框架完成以下操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接