LINQ操作符二:SelectMany

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

示例:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace SelectMany操作符
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             //使用集合初始化器初始化Teacher集合
14             List<Teacher> teachers = new List<Teacher> {
15                new Teacher("徐老师",
16                new List<Student>(){
17                  new Student("宋江",80),
18                 new Student("卢俊义",95),
19                 new Student("朱武",45)
20                }
21                ),
22                 new Teacher("姜老师",
23                new List<Student>(){
24                  new Student("林冲",90),
25                 new Student("花荣",85),
26                 new Student("柴进",58)
27                }
28                ),
29                 new Teacher("樊老师",
30                new List<Student>(){
31                  new Student("关胜",100),
32                 new Student("阮小七",70),
33                 new Student("时迁",30)
34                }
35                )
36             };
37
38             //问题:查询Score小于60的学生
39             //方法1:循环遍历、会有性能的损失
40             foreach (Teacher t in teachers)
41             {
42                 foreach (Student s in t.Students)
43                 {
44                     if (s.Score < 60)
45                     {
46                         Console.WriteLine("姓名:" + s.Name + ",成绩:"+s.Score);
47                     }
48                 }
49             }
50
51             //查询表达式
52             //方法2:使用SelectMany  延迟加载:在不需要数据的时候,就不执行调用数据,能减轻程序和数据库的交互,可以提供程序的性能,执行循环的时候才去访问数据库取数据
53             //直接返回学生的数据
54             var query = from t in teachers
55                         from s in t.Students
56                         where s.Score < 60
57                         select s;
58             foreach (var item in query)
59             {
60                 Console.WriteLine("姓名:" + item.Name + ",成绩:"+item.Score);
61             }
62             //只返回老师的数据
63             var query1 = from t in teachers
64                          from s in t.Students
65                          where s.Score < 60
66                          select new {
67                             t,
68                             teacherName=t.Name,
69                             student=t.Students.Where(p=>p.Score<60).ToList()
70                          };
71             foreach (var item in query1)
72             {
73                 Console.WriteLine("老师姓名:" + item.teacherName + ",学生姓名:" +item.student.FirstOrDefault().Name+ ",成绩:" + item.student.FirstOrDefault().Score);
74             }
75             // 使用匿名类 返回老师和学生的数据
76             var query2 = from t in teachers
77                          from s in t.Students
78                          where s.Score < 60
79                          select new { teacherName=t.Name, studentName=s.Name,studentScore=s.Score };
80             foreach (var item in query2)
81             {
82                 Console.WriteLine("老师姓名:" + item.teacherName + ",学生姓名:" + item.studentName + ",成绩:" + item.studentScore);
83             }
84
85             //使用查询方法
86             var query3 = teachers.SelectMany(p => p.Students.Where(t=>t.Score<60).ToList());
87             foreach (var item in query3)
88             {
89                 Console.WriteLine("姓名:" + item.Name + ",成绩:" + item.Score);
90             }
91             Console.ReadKey();
92
93         }
94     }
95 }
时间: 2024-08-05 14:36:59

LINQ操作符二:SelectMany的相关文章

Linq学习(二)-LinQ to Entity

在昨天我学习了LinQ的一些基础知识和动手写了一些LinQ to Object的例子的基础上,对于LinQ语法和基本的要点有了一定的了解.今天继续自己的学习,对于今天学习的LinQ to DataSet 和LinQ to Entity做自己的一些总结,一方面加深自己的理解,另一方面也能掌握LinQ技术的实现机制,对于也跟我一样对着一方面有兴趣的也可以让大家有个初步的感性认识,也是好的. 今天主要的篇幅会讲解LinQ to Entity的C#实现机制以及解决昨天我看完一小节之后的两点疑惑,后面会花

LINQ基础(二)

本文主要介绍LINQ查询操作符 LINQ查询为最常用的操作符定义了一个声明语法.还有许多查询操作符可用于Enumerable类. 下面的例子需要用到LINQ基础(一)(http://www.cnblogs.com/afei-24/p/6841361.html)的一些代码 1.筛选 LINQ查询使用where子句添加条件表达式来筛选,where子句可以合并多个表达式. var racers = from r in Formula1.GetChampions() where r.Wins>15 &

LINQ:开始使用 LINQ(二)- 基本 LINQ 查询操作

开始使用 LINQ (二)- 基本 LINQ 查询操作 一.获取数据源:from 在 LINQ 查询中,第一步是指定数据源.像在大多数编程语言中一样,在 C# 中,必须先声明变量,才能使用它.在 LINQ 查询中,最先使用 from 子句的目的是引入数据源 (customers) 和范围变量 (cust). 1 //queryAllCustomers 是 IEnumerable<Cutsomer> 类型 2 var queryAllCustomers = from cust in custom

JAVA编程思想(2) - 操作符(二)

5. 直接常量 -一般来说,如果程序里使用了"直接常量",编译器可以准确的知道要生成什么样的类型,但有时候却是模棱两可的.这时候需要我们对编译器进行适当的"指导" -直接常量后面的后缀字符标示了它的类型. -指数记数法:e代表"10的幂次" -注意如果编译器能够正确的识别类型,就不必在数值后附加字符,例如语句: float f4 = 200; 不存在含糊不清的地方,所以200后面不需要加L,但是对于:float f4 = 1e-43f; 编译器通

【c#基础】Linq操作符用法说明:

1:筛选 Where :使用where子句,可以合并多个表达式.例如:找出赢得至少15场比赛的美国和英国赛车手 var racers = from r in Formulal.GetChampions() where r.Wins > 15 && (r.Country == "USA" || r.Country == "UK") select r; foreach (var r in racers) { Console.WriteLine($&

LINQ 操作符(二)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace Lambda表达式{class Program { static void Main(string[] args) { } static List<Person> GetPersonList() { return new List<Person&g

LINQ操作符四:排序操作符

排序操作符,包括OrderBy.OrderByDescending.ThenBy.ThenByDescending和Reverse,提供了升序或者降序排序. OrderBy操作符将序列中的元素按照升序排列. 注意:orderby必须在select之前出现,查询表达式最后只可能出现select或者groupby. student类: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using Sy

LINQ操作符一:Select

一.什么是LINQ?它可以用来做什么 语言集成查询(Language Integrated Query,LINQ)是一系列标准查询操作符的集合,这些操作符几乎对每一种数据源的导航.过滤和执行操作都提供了底层的基本查询架构. LINQ可查询的数据源包括XML(可使用LINQ TO XML).关系数据(使用LINQ TO SQL,及先前的DLINQ).ADO.NET DataSet(使用LINQ TO DataSet),以及内存中的数据. 二.投影操作符:Select Select操作符对单个序列或

【LINQ技术】扩展特性和LINQ操作符

LINQ特有的编程结构 LINQ就像是嵌入到C#中的强类型查询语言,尽管和SQL查询很像,但语法却并不相同,甚至还有截然相反的一面. LINQ是在.NET发展到3.5版的时候被引进的,C#和VB语言都为此做了许多工作,扩展了大量新的编程结构. 一.隐式类型本地变量 var--一个如此小巧的关键字却有着强大的力量. var varInt=1; var varBool=True; var varString="String, String, String"; Console.WriteLi