我有一个字符串形式的表名列表。我想循环遍历列表并使用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;是一个字符串。我需要使用实际的表对象引用。
需要帮助我如何去做。
答案 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]";
}