今天写Linq表达式中Select以及SelectMany的用法,select是将一个源list投影到一个属性值或者多个属性值,也可以是另外一个属性类,通常和where子句连用,通过where子句对list进行筛选之后投影成我们需要的属性。有时我们只需要list中的单个属性,例如是需要查询井的信息,那么我们只需要知道井ID的list集合。那么我们就可以使用select语句投影成到这个井ID属性。

  • select单属性投影

石油软件类的项目通常左边为项目树,通过左边treeList的节点点击,向后台发送TreeNode属性集合,石油类部门的组织机构通常分为井区、井组、单井,当我们点击了井组集合,井区之下包含了很多口单井,井组之下包含该井组的单井,通常为5~10口单井。假设用户点击了井组节点之后,我们要获得他下面的单井节点。我们首先需要判断用户点击的是哪一级的节点,做法一般是给点击的节点赋值一个Level,通过spilt()方法判断点击是井区、井组还是单井级别。当然我们这里限定了用户点击的是井组节点,那么我们就要获取它下面所属的单井节点。需要注意的是,项目树节点传过来的类型为List。

需求:筛选出组织机构下的单井,拿到单井ID属性

做法:先使用where子句筛选是否为组织机构的单井,通过select方法投影出井的ID

var allOilWellsId = wellNode.Where(x => x is WellOrganDescriptor).OfType

().Select(x => x.WellID).ToList();

WellOrganDescriptor类封装了组织机构单井信息类,利用ofType方法限定了方法属性名,通过select方法投影出单井的ID属性,使用var匿名定义方法返回值。

打开网易新闻 查看更多图片

单属性投影

  • select多属性投影

多属性投影相比单属性投影多了定义一个new的步骤,分为两种情况,一种是new出当前list的单个属性集合,投影多个属性;第二种是new出指定的对象,将投影出来的属性赋值给指定的对象属性。下面介绍下面两种实现方式:

1、new出当前list的单个属性集合,进行多属性投影

直接上代码:

//筛选出选中的井区中的油井id

var allOilWellsId = wellNode.Where(x => x is WellOrganDescriptor).OfType

().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

WellIndexList = this.wellNodeList .Where(x => x is WellOrganDescriptor) .OfType

() .Select(item => new WellIndexDescriptor

wellId = item.WellID,

wellName = item.WellName,

wellType = item.WellType

}).ToList();

打开网易新闻 查看更多图片

多属性投影

其中wellNodeList接收到当前选中的节点集合,WellIndexDecritor定义了井ID、井名、井型,将投影出来的井ID、井名称、井型赋值给新的对象类的属性,这样就得到了相同的组织机构单井基本信息,可以给前台进行传递,并且可以进行以后的操作。

好了,今天的分享就写到这里,码字不易,技术不易,点进来的朋友麻烦给个赞或者关注转发,您的鼓励就是我不断分享的动力。