大家好,欢迎来到IT知识分享网。
今天写Linq表达式中Select以及SelectMany的用法,select是将一个源list投影到一个属性值或者多个属性值,也可以是另外一个属性类,通常和where子句连用,通过where子句对list进行筛选之后投影成我们需要的属性。有时我们只需要list中的单个属性,例如是需要查询井的信息,那么我们只需要知道井ID的list集合。那么我们就可以使用select语句投影成到这个井ID属性。
- select单属性投影
石油软件类的项目通常左边为项目树,通过左边treeList的节点点击,向后台发送TreeNode属性集合,石油类部门的组织机构通常分为井区、井组、单井,当我们点击了井组集合,井区之下包含了很多口单井,井组之下包含该井组的单井,通常为5~10口单井。假设用户点击了井组节点之后,我们要获得他下面的单井节点。我们首先需要判断用户点击的是哪一级的节点,做法一般是给点击的节点赋值一个Level,通过spilt()方法判断点击是井区、井组还是单井级别。当然我们这里限定了用户点击的是井组节点,那么我们就要获取它下面所属的单井节点。需要注意的是,项目树节点传过来的类型为List<object>。
需求:筛选出组织机构下的单井,拿到井ID属性
做法:先使用where子句筛选是否为组织机构的单井,通过select方法投影出井的ID
var allOilWellsId = wellNode
.Where(x => x is WellOrganDescriptor)
.OfType<WellOrganDescriptor>()
.Select(x => x.WellID).ToList();
IT知识分享网
WellOrganDescriptor类封装了组织机构单井信息类,利用ofType方法限定了方法属性名,通过select方法投影出单井的ID属性,使用var匿名定义方法返回值。
- select多属性投影
多属性投影相比单属性投影多了定义一个new的步骤,分为两种情况,一种是new出当前list的单个属性集合,投影多个属性;第二种是new出指定的对象,将投影出来的属性赋值给指定的对象属性。下面介绍下面两种实现方式:
1、new出当前list的单个属性集合,进行多属性投影
直接上代码:
IT知识分享网//筛选出选中的井区中的油井id
var allOilWellsId = wellNode
.Where(x => x is WellOrganDescriptor)
.OfType<WellOrganDescriptor>()
.Select(item => new { item.WellID, item.WellType })
.Where(x => x.WellType == "11")
.Select(x => x.WellID).ToList();
看出区别没,对于select投影,定义一个item属性,然后进行new出这个list的属性集合,然后投影出自己需要的属性集合。但是细心的你可能会发现,后面还加了一层where筛选,这个是在石油生产环节井分为采油井、注水井,由于需求需要选出采油井的id,所以加了这层属性的筛选,最终拿出这些油井的id。
2、new出新的对象类,将投影出来的属性进行赋值获取
List<WellIndexDescriptor> WellIndexList = this.wellNodeList
.Where(x => x is WellOrganDescriptor)
.OfType<WellOrganDescriptor>()
.Select(item => new WellIndexDescriptor
{ wellId = item.WellID,
wellName = item.WellName,
wellType = item.WellType
}).ToList();
其中wellNodeList接收到当前选中的节点集合,WellIndexDecritor定义了井ID、井名、井型,将投影出来的井ID、井名称、井型赋值给新的对象类的属性,这样就得到了相同的组织机构单井基本信息,可以给前台进行传递,并且可以进行以后的操作。
好了,今天的分享就写到这里,码字不易,技术不易,点进来的朋友麻烦给个赞或者关注转发,您的鼓励就是我不断分享的动力。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/6785.html