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

时间:2016-01-26 08:14:31

标签: c# entity-framework linq

我有一个字符串形式的表名列表。我想循环遍历列表并使用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; 
}

在上述陈述中,#34;来自表格#34;以上无效为&#34; table&#34;是一个字符串。我需要使用实际的表对象引用。

需要帮助我如何去做。

3 个答案:

答案 0 :(得分:1)

您可以使用DbContext.Set方法:

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

上面的句子将返回非泛型DbSet。因此,您将无法像往常一样使用linq进行查询。但是你可以使用动态linq。 ScottGu将explain it better than me。 请检查this thread以获取其他解决方案。

答案 1 :(得分:0)

foreach(string table in tableNames) { var query =$"select * from {table} where <some_condition>"; var list = db.ExecuteStoreQuery<Obj>(query); } 是定义LINQ的一种方法,但如果您有一个元素列表(例如SELECT DISTINCT u.id, u.first_name, u.last_name FROM friendships AS f, users AS u WHERE f.mutual = 'true' -- both are friends AND (u.id = f.source_id OR u.id = f.target_id) -- this line? AND f.created_at BETWEEN '2016-01-20' AND '2016-01-27' -- time period they became friends GROUP BY u.id, u.first_name ORDER BY u.first_name; ),则可以使用它,但是您只有您的表的名称

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

SELECT f.source_id, u1.first_name AS s_firstname, u1.last_name AS s_lastname, f.target_id, u2.first_name AS t_firstname, u2.last_name AS t_lastname
  FROM friendships AS f, users AS u1, users AS u2
  WHERE f.mutual = 'true' 
  AND u1.id = f.source_id AND u2.id = f.target_id
  AND f.created_at BETWEEN '2016-01-20' AND '2016-01-27';

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

答案 2 :(得分:0)

EF 中,您可以执行 SQL代码

在本例中,我使用EF with SQL( String

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



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