ユーザーが多数のデータフィールドを入力し、データのカスタムクエリからExcelスプレッドシートを作成したいアプリケーションがあります。
単一テーブルクエリの場合、 IEnumerable<T>
を返し、EPPlusのLoadFromCollection()
メソッドを使用して、要求された列のみを含むスプレッドシートを作成できます。例:
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の)ソリューションを使用して、すべての列( .Include
dテーブル列を含む)を含むIEnumerableを返すことで.Include
たが、関連するテーブルからMemberInfoデータを取得する方法を理解できません。最初に、要求された列リストにテーブル名を含めようとしましたが、GetMembers()はそれらを追加しませんでした。
次に、個々のテーブルごとにMemberInfo
を作成しようとしましたが、テーブル名情報を追加して1つのリストにまとめようとすると、 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);
}
EPPlus(または他のサードパーティソリューション)を使用して、複数テーブルのクエリ結果からExcelスプレッドシートにカスタム列を追加するにはどうすればよいですか?具体的には、EPPlusに関連するテーブルから含める列をどのように指示しますか?