小技巧--使用Linq处理集合数据原创
金蝶云社区-湖南吴双得
湖南吴双得
47人赞赏了该文章 2,076次浏览 未经作者许可,禁止转载编辑于2022年11月17日 13:38:48

代码开发中经常会要对DATaTable、DynamicObjectCollection、List做分组、过滤、汇总、拼接,利用Linq操作方便。


首先需要

using System.Linq;

 

DynamicObjectCollection 可以直接使用Linq的GroupBy、where、Select

DATaTable则需要转泛型参数DataRow,再使用Linq表达式

dataTable.AsEnumerable()

  

分组:GroupBy,

Sql语句查到了DynamicObjectCollection

DynamicObjectCollection GLDatas = DBUtils.ExecuteDynamicObject(ctx, strSQL)

按FBillNo分组

var varAllBills = GLDatas.GroupBy(o => new { FBillNo = Convert.ToString(o["FBillNo"]) }).Select(g => new { FBillNo = g.Key.FBillNo });

 

取前10个元素(.Take(10)

varAllBills.Take(10)

 

过滤:where

var varGLDataLines = varOverDatas.Where(o => o["FBillNo"].ToString().Equals(GLData.FBillNo)).ToList();

 

DATaTable的汇总后Join拼接

拼接:GroupBy 后再Join。  两种方式都可以。

var varList = from s in dt.AsEnumerable()
                group s by new
                {   FNumber = Convert.ToString(s["FNumber"])
                 } into m
                 select new
                 {
                    FNumber = m.Key.FNumber,
                    FMessage = string.Join(";", m.Select(c => Convert.ToString(c["FMessage"])))
                 };

 var errsList = dtErrors.AsEnumerable().GroupBy(s => new { FNumber = Convert.ToString(s["FNumber"]) }).Select(g => new { FNumber = g.Key.FNumber, FMessage = string.Join(",", g.Select(c => Convert.ToString(c["FMessage"]))) });

 

DynamicObjectCollection的汇总后Sum

汇总:GroupBy后再Sum

                var varGPDoMan = varDetailARMDS.GroupBy(s => new
                {
                    FOrgID = Convert.ToString(s["FOrgID"])
                }).Select(g => new
                {
                    FOrgID = g.Key.FOrgID,
                    FAppQty = g.Sum(n => Convert.ToInt32(n["FAppQty"]))
                }).ToList();

 

DynamicObjectCollection 批量写入List

            DynamicObjectCollection docChannel = DBUtils.ExecuteDynamicObject(ctx, strSql);
            List<string> lstFChannelID = (from d in docChannel
                                          where !d["FID"].IsNullOrEmptyOrWhiteSpace()
                                          select Convert.ToString(d["FID"])).ToList();
            //无需要签收的调拨申请单,结束
            if (docChannel== null || docChannel.Count() <= 0)
            {
                return;
            }


以后有合适的再补充


图标赞 47
47人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!