C↉中Linqクエリの基本的な操作の使用例


要約:ここでは、Linqクエリの基本的な操作(キーワードを検索)を紹介します。
-from子文
-where子文
-select子文
-グループフレーズ
-into子文
-order by子文
-ジョイン子文
-let子文
-複合from子文
−いくつかの場合、ソースシーケンスの各要素自体は、シーケンス(セット)であり、シーケンスを含むこともある。
-用語は単一データベースの内部集合にアクセスします。
-複数のfrom字句で接続を実行する
-別個のデータソースから補足のクエリを生成することができる複数のfromフレーズを含むことができます。
複合(名前の通りfromの字句が多い)例:

class Program
{ static void Main(string[] args)
    {
        List<Student> students = new List<Student> { new Student
            {
                LastName="xiaogui",Scores=new List<int>{97,42,91,60}}, new Student
                {
                    LastName="xiaozhan",Scores=new List<int>{50,92,81,60}}, new Student
                    {
                        LastName="xiaolan",Scores=new List<int>{32,32,81,90}}, new Student
                        {
                            LastName="xiaowan",Scores=new List<int>{92,22,81,60}},        
        }; var query = from stuent in students from score in stuent.Scores where score > 90 select new {
                        Last = stuent.LastName,
                        score
                    }; foreach (var student in query)// 90    {
            Console.WriteLine("{0} Score:{1}", student.Last, student.score);
        }
        Console.ReadLine();
    }
}

public class Student
{ public string LastName { get; set; } public List<int> Scores { get; set; }
} public class Employee
{ public string First { get; set; } public string Last { get; set; } public int ID { get; set; }
}
実行結果:xiaoguiスコア:97
              xiaoguiスコア:91
              xiaozhanスコア:92
              xiaowanスコア:92
letキーワード(let字句拡張範囲変数を使用)
-独自のエニュメレート・タイプを検索できるように作成します。
-クエリーは範囲変数ワードに対してのみToLowerを呼び出すことができます。
letを使用しない場合は、whereの各述語でToLowerを呼び出す必要があります。
例:各単語の先頭にaまたはeが含まれています。探し出してください。

using System; using System.Linq; public class Test
{ static void Main(string[] args)
    { string[] strings = { "A penny saved is a penny earned.", "The aaxly sdj", "the pa is no" }; var query = from sentence in strings
                    let words = sentence.Split(' ')//   from word in words
                    let w = word.ToLower()//   where w[0] == 'a' || w[0] == 'e' select word; foreach (var s in query)
        {
            Console.WriteLine(s);
        }
        Console.ReadLine();
    }
}
whereキーワード(スクリーニング)
-複数のwhere字句を含むクエリー表式
例:(aを含むものを探し出す)

using System; using System.Linq; public class Test
{ static void Main(string[] args)
    { string[] str = { "a", "b", "c" }; var query = from s in str where s == "a" select s; foreach (var s in query)
        {
            Console.WriteLine(s);
        }
        Console.ReadLine();
    }
}
ordebyキーワード(並べ替え)
-クエリー式では、order by字句は、返したシーケンスを昇順または降順にすることができます。
-1つ以上の並べ替え操作を実行するために複数のキーを指定できます。
-標準の並べ替え順序は昇順です。
-コンパイルする場合、order by字句はOrderByメソッドへの呼び出しに変換されます。ordeby字句の複数のキーをThe nByメソッドに変換して呼び出します。
descending降順
ascending昇順
例1:昇順

using System; using System.Linq; public class Test
{ static void Main(string[] args)
    { string[] str = { "a", "b", "c" }; var query = from s in str orderby s ascending select s;
    }
}
結果は:a b c
例2:降順

using System; using System.Linq; public class Test
{ static void Main(string[] args)
    { string[] str = { "a", "b", "c" }; var query = from s in str orderby s descending select s;
    }
}
結果は:c b a
グループキー(グループ)
-groupワードはIGroupling(TKey,Telement)オブジェクトのシーケンスを返します。 
-コンパイルすると、グループのサブフレーズがグループByメソッドへの呼び出しに変換されます。
(LINQクエリー表現は、selectまたはGroupで終了することができます)(グループごとに追加のクエリー操作を実行するには、intoコンテキストキーを使用して一時的な識別子を指定できます。intoを使用する場合は、引き続きクエリを作成し、最終的にはselect文または他のグループでクエリーを終了します。)
例:

using System; using System.Linq; public class Test
{ static void Main(string[] args)
    { string[] str = { "aa", "bb", "cc", "dd" }; var query = from s in str
                    group s by s[0]
                        into p where p.Key == 'a' || p.Key == 'b' || p.Key == 'c' orderby p.Key descending select p.Key; foreach (var s in query)
        {
            Console.WriteLine(s);
        }
        Console.ReadLine();
    }
}
結果は:c b a
説明:group s bys[0]into pは範囲変数sに対して「s[0]」でグループ化するという意味であり、本例では最初のアルファベットでグループ化する。
ジョインキー(接続)
−joinサブ句を使用すると、異なるソースシーケンスからの要素を対象モデルに直接関係のない要素に関連付けることができます。
-唯一の要件は、各ソースの要素は、同じ値かどうかを判断するために、ある比較を共有する必要があることです。
-join字句は特別なequalsキーワードを使って指定されたキーが等しいかどうかを比較します。
三によくある接続のタイプ
-内部連結
-グループ接続
-左外部接続
1.内部連結

var query = from a in str
join b in str2 on a.id equals b.id select new { Aname = a.name, Bname = b.name };
2.パケット接続:(intoはjoinを一時的に保存することができる)

var query = from a in str
join b in str2 on a.id equals b.id
into c select new {Aname=a.name,Cs=c}
3.左外部接続
−左外部接続において、左則ソースシーケンスのすべての要素が返されます。右則シーケンスにマッチしていない要素でもそうです。
-LINQで左外部接続を実行する場合は、DefaultifEmptyメソッドをグループに接続して、ある左にある要素がマッチしていないときに発生するデフォルトの右の要素を指定します。nullは任意の引用として使用できます。
タイプのデフォルトで、ユーザー定義のデフォルトのタイプを指定することもできます。

var query = from category in categories
join prod in products on category.id equals prod.CategoryID
into prodGroup from item prodGroup.defaultifEmpty( new Product{Name=string.empty,CategoryID=0}) select new {CatName=category.Name,ProdName=item.Name}
equalse演算子
-join子文は、同等の連接を行います。つまり、2つのキー間の等しい関係に基づいてのみマッチすることができる。
-すべての接続が等しく接続されていることを示すために、join子文はequalsキーを使用します。==演算子ではありません。
複合結合
-複合キーを使用して、複数の値が等しいかどうかをテストできます。
selectキーワード選択