LINQ操作符SelectMany的用法
SelectMany操作符提供了將多個from子句組合起來的功能,相當(dāng)于數(shù)據(jù)庫中的多表連接查詢,它將每個對象的結(jié)果合并成單個序列。
示例:
student類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SelectMany操作符 { /// <summary> /// 學(xué)生類 /// </summary> public class Student { //姓名 public string Name { get; set; } //成績 public int Score { get; set; } //構(gòu)造函數(shù) 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; } //學(xué)生集合 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("柴進(jìn)",58) } ), new Teacher("樊老師", new List<Student>(){ new Student("關(guān)勝",100), new Student("阮小七",70), new Student("時遷",30) } ) }; //問題:查詢Score小于60的學(xué)生 //方法1:循環(huán)遍歷、會有性能的損失 foreach (Teacher t in teachers) { foreach (Student s in t.Students) { if (s.Score < 60) { Console.WriteLine("姓名:" + s.Name + ",成績:"+s.Score); } } } //查詢表達(dá)式 //方法2:使用SelectMany 延遲加載:在不需要數(shù)據(jù)的時候,就不執(zhí)行調(diào)用數(shù)據(jù),能減輕程序和數(shù)據(jù)庫的交互,可以提供程序的性能,執(zhí)行循環(huán)的時候才去訪問數(shù)據(jù)庫取數(shù)據(jù) //直接返回學(xué)生的數(shù)據(jù) 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); } //只返回老師的數(shù)據(jù) 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 + ",學(xué)生姓名:" +item.student.FirstOrDefault().Name+ ",成績:" + item.student.FirstOrDefault().Score); } // 使用匿名類 返回老師和學(xué)生的數(shù)據(jù) 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 + ",學(xué)生姓名:" + 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(); } } }
到此這篇關(guān)于LINQ操作符SelectMany的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實現(xiàn)根據(jù)給出的相對地址獲取網(wǎng)站絕對地址的方法
這篇文章主要介紹了C#實現(xiàn)根據(jù)給出的相對地址獲取網(wǎng)站絕對地址的方法,涉及C#URL及字符串操作的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03C#如何控制IIS動態(tài)添加刪除網(wǎng)站詳解
這篇文章主要給大家介紹了關(guān)于C#如何控制IIS動態(tài)添加刪除網(wǎng)站的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11c#實現(xiàn)數(shù)據(jù)同步的方法(使用文件監(jiān)控對象filesystemwatcher)
這篇文章主要介紹了C#使用文件監(jiān)控對象FileSystemWatcher實現(xiàn)數(shù)據(jù)同步,大家參考使用吧2013-12-12