转换表名(字符串)以在 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"是一个字符串。我需要实际的表对象引用才能使用。
需要有关如何执行此操作的帮助。
您可以使用 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 中,您可以执行常规查询