コード例 #1
0
        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);
        }
コード例 #2
0
        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());
        }