У меня есть приложение, в котором пользователи вводят большое количество полей данных и затем хотят создавать электронные таблицы Excel из пользовательских запросов к данным.
Для запросов из одной таблицы я могу вернуть IEnumerable<T>
и использовать метод LoadFromCollection()
в EPPlus для создания электронной таблицы только с запрошенными столбцами, например:
List<string> fieldNames = userFieldsParam;
var data = Entities.MainStatements
.Where(ms => ms.FinancialYear.YearString == finYearParam);
var displayFields = typeof(MainStatements).GetMembers()
.Where(st => fieldNames.Contains(st.Name)).ToList();
worksheet.Cells["a2"].LoadFromCollection(data, false, OfficeOpenXm.Table.TableStyles.None,
BindingFlags.Default, displayFields.ToArray());
Однакопоскольку запросы пользователей охватывают связанные таблицы, мой запрос возвращает динамический класс (не IEnumerable<T>
), который не загружается.
var data = Entities.MainStatements
.Include(RevenueStatements)
.Include(ExpenditureStatements)
.Where(ms => ms.FinancialYear.YearString == finYearParam)
.Select(fieldNamesString);
Я пытался использовать решение (OP) здесь , возвращая IEnumerable со всеми столбцами (включая .Include
d столбцов таблицы), но не может понять, как получить данные MemberInfo из связанных таблиц.Сначала я попытался включить имя таблицы в запрошенный список столбцов, но GetMembers () не добавил их.
Затем я попытался создать MemberInfo
для каждой из отдельных таблиц, но когда попыталсядобавив информацию об имени таблицы, чтобы объединить их в один список, я обнаружил, что MemberInfo
только для чтения.
foreach (MemberInfo mi in typeof(RevenueStatements).GetMembers().Where(rs => fieldNames.Contains(rs.Name)))
{
mi.Name = "RevenueStatements." + mi.Name; <-- Property or indexer mi
displayFields.Add(mi);
}
Как заполнить электронную таблицу Excel из результата запроса нескольких таблиц пользовательскими столбцами с помощью EPPlus (или другого решения стороннего производителя)?В частности, как мне указать EPPlus, какие столбцы следует включить из связанных таблиц?