LINQのselectManayオペレーター(5)

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 ));
             foreachvar 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}。
            foreachvar 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 );
             foreachvar item in query5)
                Console.WriteLine(" Teacher name:" + item.TeacherName + " 、Student name:" + item.StudentName + " 、Student score:" + item。 StudentScore); 
            Console.WriteLine(" ------------------------------------------ - " ); 
            Console.ReadKey(); 
        } 
    } 

}
コードを表示

 

おすすめ

転載: www.cnblogs.com/LuckyZLi/p/12695935.html