private DataTable TransferToTable(IEnumerable <ShopProfitEntity> entities, IEnumerable <ShopExpense> expenses) { var props = typeof(ShopProfitEntity).GetProperties(); var dt = new DataTable(); var expenseKindIDs = expenses.Select(p => p.ExpenseKindID).Distinct(); IEnumerable <string> expenseKindNames = ExpenseKinds.Where(o => expenseKindIDs.Contains(o.ID)).Select(o => o.Name).ToList(); foreach (var prop in props) { dt.Columns.Add(new DataColumn(prop.Name, prop.PropertyType)); } foreach (string kn in expenseKindNames) { dt.Columns.Add(new DataColumn(kn, typeof(decimal))); } var func = GetGetDelegate(dt.Columns); foreach (var entity in entities) { var row = dt.Rows.Add(func(entity)); var tempexpenses = expenses.Where(o => o.OrganizationID == entity.OrganizationID && o.OccurDate.ToString("yyyy-MM") == entity.YearMonth).ToArray(); foreach (string kn in expenseKindNames) { var kid = ExpenseKinds.FirstOrDefault(o => o.Name == kn).ID; var expense = tempexpenses.Where(o => o.ExpenseKindID == kid).Sum(o => o.Expense); row[kn] = expense; } row["GrossProfit"] = entity.SaleMoney - tempexpenses.Sum(o => o.Expense); } return(dt); }
private Func <ShopProfitEntity, object[]> GetGetDelegate(DataColumnCollection props) { var param_obj = Expression.Parameter(typeof(ShopProfitEntity), "obj"); List <Expression> memberExps = new List <Expression>(); IEnumerable <string> expenseKindNames = ExpenseKinds.Select(o => o.Name).ToList(); foreach (DataColumn prop in props) { if (expenseKindNames.Contains(prop.ColumnName)) { memberExps.Add(Expression.Convert(Expression.Constant(0), typeof(object))); } else { memberExps.Add(Expression.Convert(Expression.Property(param_obj, prop.ColumnName), typeof(object))); } } Expression newArrayExpression = Expression.NewArrayInit(typeof(object), memberExps); return(Expression.Lambda <Func <ShopProfitEntity, object[]> >(newArrayExpression, param_obj).Compile()); }