软件编程
位置:首页>> 软件编程>> C#编程>> LINQ操作符SelectMany的用法

LINQ操作符SelectMany的用法

作者:.NET开发菜鸟  发布时间:2021-08-22 18:20:37 

标签:LINQ,SelectMany

SelectMany操作符提供了将多个from子句组合起来的功能,相当于数据库中的多表连接查询,它将每个对象的结果合并成单个序列。

示例:

student类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SelectMany操作符
{
   /// <summary>
   /// 学生类
   /// </summary>
   public class Student
   {
       //姓名
       public string Name { get; set; }
       //成绩
       public int Score { get; set; }
       //构造函数
       public Student(string name, int score)
       {
           this.Name = name;
           this.Score = score;
       }
   }
}

teacher类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SelectMany操作符
{
   /// <summary>
   /// Teacher类
   /// </summary>
   public class Teacher
   {
       //姓名
       public string Name { get; set; }
       //学生集合
       public List<Student> Students { get; set; }

public Teacher(string name, List<Student> students)
       {
           this.Name = name;
           this.Students = students;
       }
   }
}

Program类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SelectMany操作符
{
   class Program
   {
       static void Main(string[] args)
       {
           //使用集合初始化器初始化Teacher集合
           List<Teacher> teachers = new List<Teacher> {
              new Teacher("徐老师",
              new List<Student>(){
                new Student("宋江",80),
               new Student("卢俊义",95),
               new Student("朱武",45)
              }
              ),
               new Teacher("姜老师",
              new List<Student>(){
                new Student("林冲",90),
               new Student("花荣",85),
               new Student("柴进",58)
              }
              ),
               new Teacher("樊老师",
              new List<Student>(){
                new Student("关胜",100),
               new Student("阮小七",70),
               new Student("时迁",30)
              }
              )
           };

//问题:查询Score小于60的学生
           //方法1:循环遍历、会有性能的损失
           foreach (Teacher t in teachers)
           {
               foreach (Student s in t.Students)
               {
                   if (s.Score < 60)
                   {
                       Console.WriteLine("姓名:" + s.Name + ",成绩:"+s.Score);
                   }
               }
           }

//查询表达式
           //方法2:使用SelectMany  延迟加载:在不需要数据的时候,就不执行调用数据,能减轻程序和数据库的交互,可以提供程序的性能,执行循环的时候才去访问数据库取数据
           //直接返回学生的数据
           var query = from t in teachers
                       from s in t.Students
                       where s.Score < 60
                       select s;
           foreach (var item in query)
           {
               Console.WriteLine("姓名:" + item.Name + ",成绩:"+item.Score);
           }
           //只返回老师的数据
           var query1 = from t in teachers
                        from s in t.Students
                        where s.Score < 60
                        select new {
                           t,
                           teacherName=t.Name,
                           student=t.Students.Where(p=>p.Score<60).ToList()
                        };
           foreach (var item in query1)
           {
               Console.WriteLine("老师姓名:" + item.teacherName + ",学生姓名:" +item.student.FirstOrDefault().Name+ ",成绩:" + item.student.FirstOrDefault().Score);
           }
           // 使用匿名类 返回老师和学生的数据
           var query2 = from t in teachers
                        from s in t.Students
                        where s.Score < 60
                        select new { teacherName=t.Name, studentName=s.Name,studentScore=s.Score };
           foreach (var item in query2)
           {
               Console.WriteLine("老师姓名:" + item.teacherName + ",学生姓名:" + item.studentName + ",成绩:" + item.studentScore);
           }

//使用查询方法
           var query3 = teachers.SelectMany(p => p.Students.Where(t=>t.Score<60).ToList());
           foreach (var item in query3)
           {
               Console.WriteLine("姓名:" + item.Name + ",成绩:" + item.Score);
           }
           Console.ReadKey();

}
   }
}

来源:https://www.cnblogs.com/dotnet261010/p/6849980.html

0
投稿

猜你喜欢

  • 本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下棋盘模块:画五子棋棋盘:19条横线、19条竖线步骤一:显示棋盘我有
  • 本文实例为大家分享了Java实现串口通信的具体代码,供大家参考,具体内容如下1.介绍使用Java实现的串口通信程序,支持十六进制数据的发送与
  • 如何快速判断一个元素是不是在一个集合里?这个题目是我最近面试的时候常问的一个问题,这个问题不同人都有很多不同的回答。今天想介绍一个很少有人会
  • 简评:作为一位 Android 开发者,Android Studio 肯定是每天都要打交道的,熟练掌握其中的快捷键等技巧可以提高我们不少的效
  • 前言本章内容主要研究一下java高级特性-反射、android注解、和 * 的使用,通过了解这些技术,可以为了以后实现组件化或者Api h
  • 在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择。这些功能我们叫它Android Di
  • 前言在java中遍历Map有不少的方法。这篇文章我们就来看一下Java读取Map的两种方法以及这两种方法的对比。一、 遍历Map方
  • 1. 将一些需要变动的配置写在属性文件中比如,没有把一些需要并发执行时使用的线程数设置成可在属性文件中配置。那么你的程序无论在DEV环境中,
  • 本文参考文档Add Flutter to existing apps。首先有一个可以运行的原生项目第一步:新建Flutter moduleT
  • 这是个我在C#调用批处理文件时遇到的问题。首先我通过Process.Start方法调用一个批处理文件,那个批处理文件里面则调用了一大堆程序。
  • 初识LinkedHashMap大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭
  • 一、项目整体介绍:项目整体的结构如下图所示,项目整体采用 springboot + mybatis + jsp + mysql 来完成的,下
  • 前言泛型,一个孤独的守门者。大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可
  • 本文实例为大家分享了Android实现简单banner轮播图的具体代码,供大家参考,具体内容如下说明:想玩一个简单的轮播图效果 
  • 1、Java序列化与反序列化是什么?Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象
  • 引言前面在学习协程启动方式的时候在launch的源码中有一个返回值是Job,async的返回Deferred也是实现了Job,那么而也就是说
  • 背景数据之间两两趋势比较在数据分析应用中是非常常见的应用场景,如下所示:模拟考批次班级学生语文数学英语202302三年一班张小明130145
  • 目录多通道分离API操作通道合并API操作结果源码多通道分离APIpublic static void split(Mat m, List&
  • 如下所示:public static void main(String[] args) throws IOException {  
  • SpringBatch介绍:SpringBatch 是一个大数据量的并行处理框架。通常用于数据的离线迁移,和数据处理,⽀持事务、并发、流程、
手机版 软件编程 asp之家 www.aspxhome.com