Linq实现分组的不同字段汇总

来源:互联网 发布:软件开发管理流程图 编辑:程序博客网 时间:2024/05/21 19:04

  最近遇到一个需求,情景如下:

对于一个工厂,工人可能会属于多个工种,比如

 对应的数据库存储结构是:

工人与工种表(tbl_worker_craft)工人工种工人1工种1工人1工种2工人1工种3工人2工种1工人3工种4


最终界面显示为:       

显示界面工人工种工人1工种1,工种2,工种3工人2工种1工人3工种4


Linq实现:

///查询出来冗余数据

var list=from o in tbl_worker_craft

              select new tbl_worker_craft

             {

                 worker=o.worker,

                  craft=o.craft

             }

  ///对数据进行分组  IEnumerable<IGrouping<string, tbl_worker_craft>> jointGroup = list.GroupBy(o => o.工人, o => o);
 ///取交集,将list中有相同工人的数据去除,保存到listd中 IList<tbl_worker_craft> listd = list.Intersect(list, new WorkerCraftEquality()).ToList();   //自定义比较类见下
 ///将list,和listd的key值对应,将list中冗余的某个工人对应的所有工种,拼接到一起
foreach (var item in jointGroup)           
{
  List<tbl_worker_craft> jointList = item.ToList(); //取某个工人的所有冗余数据
tbl_worker_craft oldjoin = listd.SingleOrDefault(o => o.工人 == item.Key); //在listd中获取到对应的值
 string craft_item = ""; //定义工种的拼接值
  foreach (var ditem in jointList)
{
craft_item += ditem.工种+ ","; //循环拼接该工人的最终工种组成串
}               
oldjoin.工种= craft_item; //将最终的工种拼接值赋给该工人的工种字段
listd.Remove(listd.SingleOrDefault(o => o.工人 == item.Key)); //移除原来的listd中该工人的唯一数据
listd.Add(oldjoin);
}
return listd; //最终的listd就是所得

注:
        /// <summary>        /// 自定义模板表的比较类         /// </summary>        public class WorkerCraftEqualityIEqualityComparer<tbl_worker_craft>        {            public bool Equals(tbl_worker_craft x, tbl_worker_craft y)            {                return x.工人 == y.工人;            }             public int GetHashCode(tbl_worker_craft obj)            {                if (obj == null)                {                    return 0;                }                else                {                    return obj.ToString().GetHashCode();                }            }         }






  


原创粉丝点击