【发布时间】:2020-02-04 21:43:41
【问题描述】:
有没有办法使用 system.linq.dynamic 使用字符串作为表名来连接表?
这似乎是基本的,但所有谷歌搜索都指向一些极其复杂的答案,扩展了 linq 的功能,这似乎我只是错过了一些简单的东西。
我的应用程序允许人们通过从多个表中动态添加条件和字段来构建数据过滤器。
我有一个格式为“TableName.FieldName”的字段数组列表作为字符串。 必须使用此字符串列表创建动态查询。
我有一个名为 Table1 的主表作为基本起点。因此,在构建查询时,他们总是从那里开始,但之后可以从其他表中添加字段。如果包含任何其他表,则它必须使用主键连接回 Table1。
使用 system.linq.dynamic 构建 where 子句似乎很容易。
var query = dbcontext.Table1;
Dictionary<string, ArrayList> reportTables; //store table and its respective field names as an array
query.Select(string.Join(",", reportTables["Table1"].ToArray()));
但是现在我怎样才能轻松地加入子表呢?
我开始循环遍历表,如果它不是主表,我想添加这样的连接:
if(reportTables.Keys.Count > 1){
// add joins
foreach(string tblName in reportTables.Keys)
{
if(tblName != "Table1")
{
query.Join(tblName, "Table1.IDField", tblName + ".Table1IDField")
}
}
}
更新:
感谢@NetMage,我能够通过这样做来编译和运行应用程序
var query = (IQueryable)db.Table1;
Dictionary<string, IQueryable> tableTypeDictIQ = new Dictionary<string, IQueryable>()
{
{ "Table2", db.Table2},
{ "Table3", db.Table3 }
}
if (reportTables.Keys.Count > 1)
{
// add joins
var joinCount = 0;
foreach (string tblName in reportTables.Keys)
{
if (tblName != "Table1")
{
if (joinCount == 0)
query = query.Join(tableTypeDictIQ[tblName], "RECDNO", "RECDNO", "new(outer as Table1,inner as Table2)");
else
query = query.Join(tableTypeDictIQ[tblName], "Table1.RECDNO", tblName + ".RECDNO", $"new({string.Join(",", Enumerable.Range(1, joinCount + 1).Select(n => $"outer.Table{n} as Table{n}"))}, inner as Table{joinCount + 2})");
++joinCount;
}
}
}
【问题讨论】:
-
你能用
Where()创建一个伪连接吗?
标签: entity-framework linq linq-to-sql linq-to-entities