GroupBy分组的运用和linq左连接
最简单的分组
var conHistoryList = conHistoryData.GroupBy(g => g.personId);
就是conHistoryData是一个IQueryable<T>类型;
分组后组内排序
var conHistoryList = conHistoryData.GroupBy(g => g.personId).Select(g => g.OrderBy(c => c.addTime));
对数据分组之后在根据每一个分组内的某一个元素排序。
分组后排序返回第一个
var conHistoryList = conHistoryData.GroupBy(g => g.personId).Select(g => g.OrderBy(c => c.addTime).FirstOrDefault()).ToList();
对数据分组之后在根据每一个分组内的某一个元素排序。排序之后在返回第一个元素,然后组成一个集合返回。这个实现的是根据分组取组内第一个元素然后重新返回一个元素列表。
使用组内元素
var dd = conHistoryData.GroupBy(g => g.personId);
//获取每个分组的键
foreach (var item in dd)
{
string GroupByKey = item.Key;
//获取每个分组的内容
foreach (var item2 in item)
{
ContractHistoryInfor historyInfor = item2;
}
}
多次分组组合
var childDetailListData = new List<ChildFactDetailInfor>();
var childDetailListG = childDetailList.GroupBy(b => b.materialCategory).Select(g => g.GroupBy(b => b.materialNum));
childDetailList是一个List<ChildFactDetailInfor>集合。通过先分组materialCategory字段,然后在在分组内根据materialNum字段再次分组。
使用多次分组的元素
var childDetailListData = new List<ChildFactDetailInfor>();
var childDetailListG = childDetailList.GroupBy(b => b.materialCategory).Select(g => g.GroupBy(b => b.materialNum));
foreach (var item in childDetailListG)
{
foreach (var item2 in item)
{
decimal? a = item2.Sum(x => x.materialNum);
decimal? c = item2.Sum(x => x.priceTotal);
foreach (var item3 in item2)
{
item3.materialNum = a;
item3.priceTotal = c;
childDetailListData.Add(item3);
}
}
}
和上面使用元素差不多就是遍历层数
补充记录一个linq左连接多表关联去除控数据示例:
var data = (from a in childData
join bj in bjCostData
on a.id equals bj.childId
into bj
from bje in bj.DefaultIfEmpty()
join bjt in bjRefundData
on a.id equals bjt.childId
into bjt
from bjte in bjt.DefaultIfEmpty()
//学平险
join xpx in xpxCostData
on a.id equals xpx.childId
into xpx
from xpxe in xpx.DefaultIfEmpty()
join xpxt in xpxRefundData
on a.id equals xpxt.childId
into xpxt
from xpxte in xpxt.DefaultIfEmpty()
//餐费
join cf in cfCostData
on a.id equals cf.childId
into cf
from cfe in cf.DefaultIfEmpty()
join cft in cfRefundData
on a.id equals cft.childId
into cft
from cfte in cft.DefaultIfEmpty()
//自定义
join zdy in zdyCostData
on a.id equals zdy.childId
into zdy
from zdye in zdy.DefaultIfEmpty()
join zdyt in zdyRefundData
on a.id equals zdyt.childId
into zdyt
from zdyte in zdyt.DefaultIfEmpty()
//休园
join xy in xyCostData
on a.id equals xy.childId
into xy
from xye in xy.DefaultIfEmpty()
join xyt in xyRefundData
on a.id equals xyt.childId
into xyt
from xyte in xyt.DefaultIfEmpty()
//押金
join yj in yjCostData
on a.id equals yj.childId
into yj
from yje in yj.DefaultIfEmpty()
join yjt in yjRefundData
on a.id equals yjt.childId
into yjt
from yjte in yjt.DefaultIfEmpty()
select new H_ChildStatistics
{
id = a.id,
parkId = a.parkId,
parkName = a.parkName,
childName = a.childName,
childNameEng = a.childNameEng,
gradeNo = a.gradeNo,
classNo = a.classNo,
modifyTime = a.modifyTime,
bjfTotalReceive = bje == null ? : bje.payTotalMoney,
bjfTotalRefund = bjte == null ? : bjte.payTotalMoney,
xpxTotalReceive = xpxe == null ? : xpxe.payTotalMoney,
xpxTotalRefund = xpxte == null ? : xpxte.payTotalMoney,
cfTotalReceive = cfe == null ? : cfe.payTotalMoney,
cfTotalRefund = cfte == null ? : cfte.payTotalMoney,
xyglfTotalReceive = xye == null ? : xye.payTotalMoney,
xyglfTotalRefund = xyte == null ? : xyte.payTotalMoney,
yjTotalReceive = yje == null ? : yje.payTotalMoney,
yjTotalRefund = yjte == null ? : yjte.payTotalMoney,
zdyTotalReceive = zdye == null ? : zdye.payTotalMoney,
zdyTotalRefund = zdyte == null ? : zdyte.payTotalMoney,
childTotalReceive = ((bje == null ? : bje.payTotalMoney) + (xpxe == null ? : xpxe.payTotalMoney) + (cfe == null ? : cfe.payTotalMoney) + (xye == null ? : xye.payTotalMoney) + (yje == null ? : yje.payTotalMoney) + (zdye == null ? : zdye.payTotalMoney)),
childTotalRefund = ((bjte == null ? : bjte.payTotalMoney) + (xpxte == null ? : xpxte.payTotalMoney) + (cfte == null ? : cfte.payTotalMoney) + (xyte == null ? : xyte.payTotalMoney) + (yjte == null ? : yjte.payTotalMoney) + (zdyte == null ? : zdyte.payTotalMoney)),
});
GroupBy分组的运用和linq左连接的更多相关文章
- C# linq左连接与分组
1.左连接使用DefaultIfEmpty(): 2.分组时候判断newper.FirstOrDefault() == null ? null: newper.ToList()这个经常出错误,如果不判 ...
- Linq Left Join;linq左连接 (转载)
来源 https://www.cnblogs.com/xinjian/archive/2010/11/17/1879959.html 准备一些测试数据,如下: use Test Create tabl ...
- linq 左连接后实现与主表一对一关系数据
var query1 = from r in _residentRepository.GetAll() join i in _inLogRepository.GetAll() on r.Id equa ...
- EF to linq 左连接
如果连接的数据不存在用 null 表示,则可以左连接查询,但是如果数据类型为 int 则会出错. var ng = (from g in _db.NET_NEWS_GROUP join z in _d ...
- Linq 左连接 left join
Suppose you have a tblRoom and tblUserInfo. Now, you need to select all the rooms regardless of whet ...
- linq左连接
Table1和Table2连接,把Table1的全列出来 var tempData = from a in table1 join b in table2 on a.Id equals b.aId i ...
- linq 左连接
var list = (from item in vall join item3 in v1 on new { item.FItemID, item.FAuxPropID } equals new { ...
- linq左连接查询加上into后怎么查询右表是否为空
//判断右表是否为空并为映射表进行赋值标志var query=from q in product join m in favProduct on q.Name equals m.Name into t ...
- linq 左连接实现两个集合的合并
//第一个集合为所有的数据 var specilist = new List<Me.SpecificationsInfo>(); var resultall = (from a in db ...
随机推荐
- 第二节——vue多页面开发
我们平常用vue开发的时候总觉得vue好像就是专门为了单页面应用而诞生的,其实不是.因为vue在工程化开发的时候很依赖webpack,而webpack是将所有的资源整合到一块,弄成一个单页面. 但是v ...
- 如何监控redis的cpu使用率
redis默认是单线程运行的,为了充分利用机器的cpu,正常情况下一台服务器上会装多个实例.如果通过top命令监控机器的cpu的话,监控值很笼统,不能精确到单redis实例的cpu使用率监控.而且ce ...
- Android逆向之smali
Android逆向之smali 头信息 smail文件前三行 .class <访问权限> [关键修饰字] <类名>; .super <父类名>; .source & ...
- [算法专题] BST&AVL&RB-Tree
BST 以下BST的定义来自于Wikipedia: Binary Search Tree, is a node-based binary tree data structure which has t ...
- video设置autoplay 不起作用
video 标签上添加 muted https://blog.csdn.net/taiyangmiaomiao/article/details/80266625
- JavaScript中关于页面URL地址的获取
1 window.location.host; //返回url的主机部分,例如 www.xxx.com window.location.hostname; //返回url的主机名,例如 www.xxx ...
- Nginx 负载均衡与反向代理
通过设置权重来轮询 weight server 192.168.1.62 weight=5 server 192.168.63 weight=1 ip_hash 第3方均衡策略 fair url_h ...
- OpenStack-Ocata版+CentOS7.6 云平台环境搭建 —7.网络服务Neutron配置
网络服务Neutron本章节结束如何安装并配置网络服务(neutron)采用:ref:`provider networks <network1>`或:ref:`self-service n ...
- Linux下解压.tar.xz格式文件的方法
前言 对于xz这个压缩相信很多人陌生,但xz是绝大数linux默认就带的一个压缩工具,xz格式比7z还要小. 今天在下载Node.js源码包的时候遇到的这种压缩格式.查了一下资料,这里进行一下记录,分 ...
- maven个人总结
一.解压maven(apache-maven-3.6.0-bin.zip) ---apache-maven-3.6.0 ---bin(Binary书写) >存放二进制可执行的文件(命令),例如m ...