Linq查詢基本操做

摘要:本文介紹Linq查詢基本操做(查詢關鍵字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 - 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 Score:97 xiaogui Score:91 xiaozhan Score:92 xiaowan Score:92 let 關鍵字(使用let字句擴展範圍變量) - 建立一個能夠查詢自身的可枚舉類型 - 使查詢只能對範圍變量word調用一次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();
    }
}
複製代碼
orderby 關鍵字 (排序) - 在查詢表達式中,orderby字句可使返回的序列(組)按升序或降序。 - 能夠指定多個鍵,以便執行一個或多個次要排序操做 - 默認排序順序爲升序 - 編譯時,orderby字句被轉換爲對OrderBy方法的調用。orderby字句中的多個鍵被轉換爲ThenBy方法調用 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 關鍵字 (分組) - group 字句返回一個IGrouping(TKey,Telement)對象序列 - 編譯時,group子句被轉換爲對GroupBy方法的調用 (LINQ查詢表達式能夠以select或者Group結束) (若是想要對每一個組執行附加查詢操做,則可使用into上下文關鍵字指定一個臨時標識符,使用into時,必須繼續編寫該查詢,並最終用一個select語句或另外一 個group子句結束該查詢) 例:
複製代碼
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 by s[0] into p 意思是針對範圍變量s用「s[0]」分組,本例中是用第一個字母分組 join 關鍵字 (聯接) - 使用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 子句執行同等聯接。換句話說,只能基於兩個鍵之間的相等關係進行匹配 - 爲了代表全部聯接都是相等聯接,join子句使用equals關鍵字而不是==運算符 複合鍵 - 使用複合鍵能夠測試多個值是否相等 select 關鍵字 選擇
相關文章
相關標籤/搜索