C# LINQ 生成List<T>交叉表数据


《费用一览表》报表

C# LINQ 生成List<T>交叉表数据

 

LINQ 源码

C# 全选
        /// <summary>
        /// 费用一览表报表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public res_AccountFeeSummary QueryAccountFeeSummary(req_AccountFee input)
        {
            var q = _Database.GetQueryable<dt_AccountFee>();
            var q_AccountItems = _Database.GetQueryable<dt_AccountItems>();

            q = q.Where(w => w.FlagApp == "Y");

            if (!input.FENO.IsEmpty())
                q = q.Where(w => w.FENO == input.FENO);

            if (input.DocDateFrom > Globals.MinSqlDate)
                q = q.Where(w => w.DocDate >= input.DocDateFrom);

            if (input.DocDateTo > Globals.MinSqlDate)
                q = q.Where(w => w.DocDate <= input.DocDateTo);

            if (!input.AccountId.IsEmpty())
                q = q.Where(w => w.AccountId == input.AccountId);

            if (!input.ARAP.IsEmpty())
                q = q.Where(w => w.ARAP == input.ARAP);

            if (!input.SONO.IsEmpty())
                q = q.Where(w => w.SONO == input.SONO);

            //左连接,left join
            var listSource = (from a in q
                              join b in q_AccountItems on a.AccountId equals b.ItemID into tmp
                              from b in tmp.DefaultIfEmpty()
                              select new
                              {
                                  isid = a.isid,
                                  YYYYMM = a.DocDate.Value.Year.ToString() + a.DocDate.Value.Month.ToString().PadLeft(2, '0'),
                                  ItemId = a.AccountId,
                                  ItemName = b != null ? b.ItemName : "",
                                  Amount = a.ARAP == "收" ? a.Amount : (a.Amount ?? 0) * -1,//收:正数,支:负数
                              }).ToList();

            //01/02/03项目编码
            var stringList = listSource.Select(s => s.ItemId).Distinct().ToList();

            //返回的结果数据
            var listResult = new List<res_AccountFeeSummaryItem>();

            //设置交叉表数据
            foreach (var item in listSource)
            {
                var row = listResult.Where(s => s.YYYYMM == item.YYYYMM).FirstOrDefault();

                if (row == null)
                {
                    row = new res_AccountFeeSummaryItem
                    {
                        YYYYMM = item.YYYYMM,
                        ItemId = item.ItemId,
                        ItemName = item.ItemName,
                    };
                    listResult.Add(row);
                }

                //生成属性名称:F01/F02/F03
                var fieldName = "F" + (stringList.IndexOf(item.ItemId) + 1).ToString().PadLeft(2, '0');

                //动态赋值
                ObjectHelper.SetPropertyValue(row, fieldName, (row.Amount ?? 0) + (item.Amount ?? 0));
            }

            //返回结果
            return new res_AccountFeeSummary
            {
                AccountItems = stringList,
                ListData = listResult,
            };
        }
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
上一篇:C# LINQ 查询时间范围条件
下一篇:C# LINQ MRP物料需求运算模板代码
评论列表

发表评论

评论内容
昵称:
关联文章

C# LINQ 生成List<T>交叉数据
C#List<T>介绍与用法
C# EF+LINQ保存主从数据
C# LINQ List<T>.ForEach迭代器扩展方法
C# List<Object>和List<T>实体对象模型相互转化
C# LINQ基础-Linq基本使用方法
C# LINQ 找出两个列表数组中不存在于某个list的元素
LINQ 删除多数据、检查数据引用
C# LINQ 使用事务删除主从数据
C# LINQ关联两个List更新数据
C# Winform 使用SUM CASE WHEN实现动态列交叉数据报表
C#.NET LINQ入门基础
LINQ 返回多组数据、组合数据
C#多线程处理多个队列的数据(交叉线程访问及Invoke方法使用)
C# LINQ 判断记录重复
DAL - 单数据字典数据访问层C#代码
C# LINQ行转列输出年度报表、月度汇总报表、应收明细汇总
C#DataTable(转List /JSON/字典 互转)
C# LINQ使用案例参考
DAL - 主从业务单据数据访问层C#代码