转换表名(字符串)以在 LINQ 查询中使用它:C#,实体框架

本文关键字:框架 实体 查询 字符串 LINQ 以在 转换 | 更新日期: 2023-09-27 18:31:49

>我有一个字符串形式的表名列表。我想遍历列表并在 LINQ 查询中使用表名:

var db = new SomeContext();
// for a single table I can use the LINQ query as
var res = from q in db.Table
          where ......
          select q;

而且效果很好。

上述方法是硬编码。为此,我需要一个通用解决方案来遍历名称存储在列表中的多个表。

// list of string containing table names
List<stringtableNames = [Get the table list from some source]
// not a problem here

循环访问表名称,并为每个名称执行 LINQ 查询,如下所示

foreach(string table in tableNames)
{ 
    var queryRes = from t in table
                   where <some_condition>
                   select t; 
}

在上面的语句中,上面的"from t in table"是无效的,因为"table"是一个字符串。我需要实际的表对象引用才能使用。

需要有关如何执行此操作的帮助。

转换表名(字符串)以在 LINQ 查询中使用它:C#,实体框架

您可以使用 DbContext.Set 方法:

Set(System.Type.GetType("TableName"))

上面的句子将返回一个非通用的 DbSet。因此,您将无法像往常一样使用 linq 进行查询。但您可以使用动态 linq。斯科特古会比我解释得更好。请检查此线程以获取其他解决方案。

EF 中,可以执行 SQL 代码

在此示例中,我将 EF 与 SQL(字符串)一起使用

var db = new SomeContext();
var list = db.ExecuteStoreQuery<Obj>(Obj.sql);

class Obj
{
   public const string sql = @"select [tbl].[field] from [tbl]";
}

select, where, from 是定义 LINQ 的一种方法,但是如果您有元素列表(例如IEnumerable<T>),您可以使用它,但您只有 您的表的名称

我认为您必须创建一个常规的SQL查询

foreach(string table in tableNames)
{ 
  var query =$"select * from  {table} where <some_condition>"; 
  var list = db.ExecuteStoreQuery<Obj>(query);
}

在 EF 中,您可以执行常规查询