SelectMany演算子は、複数のfrom句を組み合わせる機能を提供します。これは、データベース内の複数テーブル結合クエリに相当し、各オブジェクトの結果を単一のシーケンスに組み合わせます。
サンプルコードは次のとおりです。
システムの使用; System.Collections.Generic; を使用します。 System.Linq を使用します。 System.Text を使用します。 名前空間ConsoleApplication5 { パブリック クラスStudent { パブリック 文字列 Name { get ; セット; } public int Score { get ; セット; } public Student(string name、int score) { this .Name = name; この .Score =スコア; } } public class Teacher { public string Name { get ; セット; } public List <Student>学生{ get ; セット; } public Teacher(string name、List <Student> students) { this .Name = name; この .Students = 学生; } } クラスProgram { static void Main(string[] args) { // set初期化子を使用してTeacherコレクション リストを初期化します <Teacher> Teachers = new List <Teacher> { new Teacher( " 徐老师" 、 new List <Student> (){ new Student(" 宋江"、80 )、 新しい学生(" Lu Junyi "、55 )、 新しい学生(" Zhu Wu "、45) } )、 新しい教師( " 姜老师" 、 新しいリスト<学生> (){ 新しい学生(" 林緩衝"、90 )、 新しい学生(" 花荣"、85 )、 新しい学生(" 柴更"、58 ) } )、 新しい教師("ファン先生" 新たな新しいリスト<学生> (){ 新新しい生徒(" オフ盛" 100 )、 新たな新しい学生(" 阮小七" 70 )、 新しい新しい学生(" 移動」、30 ) } ) }; / / 質問:スコアが60未満の生徒にクエリ // 方法1:ループトラバーサル、foreach(Teacher t in { 教師) foreachの(スチューデントS でt.Students) { IF(s.Score < 60 ) { Console.WriteLineを(" 名:" + s.Name + " グレード:" + s.Score); } } } Console.WriteLineを(" ------------------------------------------- " ); // メソッド2:SelectManyの遅延読み込みを使用します。データが不要な場合、呼び出しデータは実行されません。これにより、プログラムとデータベース間の相互作用が減少し、プログラムのパフォーマンスが提供されます。ループが実行された場合にのみ、データベースにアクセスしてデータを取得します // 生徒の情報のみが返されますクエリ式 VaRの query0 = から T で教師 から S にt.Students s.Score < 60 SELECT ; S foreachの(VARの項目でquery0) Console.WriteLineを(" 名前" + item.name + " グレード:" + アイテム。スコア); Console.WriteLine(" ------------------------------------------ - " ); // 学生情報クエリメソッドのみを返す var query1 = Teachers.SelectMany(t => t.Students).Where(s => s.Score < 60 ); var query2 = Teachers.SelectMany(t => t.Students.Where(s => s.Score < 60 )); foreach(var item in query1) Console.WriteLine(" Name:" + item.Name + " 、grade:" + item.Score); Console.WriteLine(" ---------- --------------------------------- " ); // 匿名クラスを使用して教師と生徒の情報を返す--- query式 var query3 = from tで教師 から S にt.Students s.Score < 60 選択新しい {TeacherName = t.Name、StudentName = s.Name、StudentScore = s.Score}。 foreach(var item in query3) Console.WriteLine(" 教师姓名:" + item.TeacherName + " 、学生姓名:" + item.StudentName + " 、学生成绩:" + item.StudentScore); Console.WriteLine(" ------------------------------------------- " ); // 匿名を使用クラスは教師と生徒の情報を返します---クエリメソッド var query5 = Teachers.SelectMany(t => t.Students.Where(s => s.Score < 60 ) .Select(p => new {TeacherName = t.Name、 StudentName = p.Name、StudentScore = p.Score})); var query6 = Teachers.SelectMany(t => t.Students、 (t、s) => new {TeacherName = t.Name、StudentName = s.Name、 StudentScore = s.Score}). Where(n=> n.StudentScore < 60 ); foreach(var item in query5) Console.WriteLine(" Teacher name:" + item.TeacherName + " 、Student name:" + item.StudentName + " 、Student score:" + item。 StudentScore); Console.WriteLine(" ------------------------------------------ - " ); Console.ReadKey(); } } }