Есть ли способ использовать system.linq.dynami c для объединения таблиц, используя строку для имени таблицы?
Кажется, что это будет основа c, но все точки гуглинга для некоторых чрезвычайно сложные ответы, расширяющие функциональность linq, и мне кажется, что я просто упускаю что-то простое.
Мое приложение позволяет людям создавать фильтры на основе данных, динамически добавляя критерии и поля из нескольких таблиц.
У меня есть ArrayList полей в формате «TableName.FieldName» в виде строк. Динамический запрос c должен быть создан с использованием этого списка строк.
У меня есть основная таблица Table1 в качестве базовой отправной точки. Поэтому при построении запроса они всегда начинаются там, но могут добавлять поля из других таблиц после. если включена какая-либо из других таблиц, она должна выполнить соединение с таблицей 1. Использование первичного ключа.
Использование system.linq.dynami c Создание предложения 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;
}
}
}