2013年12月16日 星期一

C# - LINQ 查詢運算式

說明的話,因為這次想偷懶一下,所以大部分用微軟官方的說明最清楚不過了(煙),以下是微軟官方對LINQ的說明:

ALanguage-Integrated Query (LINQ) 是一組技術的名稱,這組技術所憑藉的基礎是將查詢功能直接整合至 C# 語言 (以及 Visual Basic,也可能是其他任何 .NET 語言) 中。透過 LINQ,查詢現在已成為第一級的語言建構,就如同類別、方法、事件等等。
對於撰寫查詢的開發人員而言,LINQ 最明顯的「語言整合」部分就是它的查詢運算式。查詢運算式是以 C# 3.0 所引入的宣告式「查詢語法」(Query Syntax) 來撰寫。透過使用查詢語法,您可以使用最少的程式碼,在資料來源上執行更為複雜的篩選、排序和群組等作業。您可以使用相同的基本查詢運算式模式,在 SQL 資料庫、ADO.NET 資料集、XML 文件和資料流以及 .NET 集合中查詢及轉換資料。

下列範例顯示完整的查詢作業。 這套完整的作業包括建立資料來源、定義查詢運算式,以及在 foreach 陳述式中執行查詢。

class LINQQueryExpressions
{
    static void Main()
    {

        // Specify the data source.
        int[] scores = new int[] { 97, 92, 81, 60 };

        // Define the query expression.
        IEnumerable<int> scoreQuery =
            from score in scores
            where score > 80
            select score;

        // Execute the query.
        foreach (int i in scoreQuery)
        {
            Console.Write(i + " ");
        }            
    }
}

在介紹之前,請大家先行了解什麼是 IEnumerable<T> 及 Enumerable 類別 ,因為這是使用 Linq 在存取各種型態資料時最主要的核心技術基礎。
 LINQ要取得資料時,以 C# 語言而言,最重要的是透過 foreach 語法來達成。
可以看到,LINQ在使用上和SQL有非常雷同之處,所以應該是不默生。

namespace MyProjects
{
    class Program
    {
        static void Main(string[] args)
        {
            // 新增相機品牌清單至 List<T> 中,成為一個陣列集合物件體
            List<string> CameraList = new List<string>();
            CameraList.Add("Nikon");
            CameraList.Add("Sony");
            CameraList.Add("Canon");
            CameraList.Add("Fujifilm");
            CameraList.Add("Pentax");
            CameraList.Add("Olympus");
            CameraList.Add("Ricoh");
            CameraList.Add("Panasonic");

            // 列出相機清單內容
            Console.WriteLine("→ 原始 CameraList清單");
            foreach (string listone in CameraList)
            {
                Console.Write(listone + ", ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 建立 Linq 語法
            IEnumerable<string> N_CameraBrand =
                from temp_VarEnum in CameraList
                where temp_VarEnum.StartsWith("N")
                select temp_VarEnum;

            Console.WriteLine("→ N開頭的品牌:");

            // 列印結果
            foreach (string N_Camera in S_CameraBrand)
            {
                Console.WriteLine(N_Camera + ",");
            }

            Console.ReadKey();
        }
    }

}


以下是微軟對於LINQ特性的詳述:
查詢運算式概觀

  • 查詢運算式可用來查詢及轉換 LINQ 所支援之資料來源中的資料。 例如,單一查詢可以從 SQL 資料庫擷取資料,並產生 XML 資料流做為輸出。
  • 查詢運算式非常容易學習,因為它使用了許多類似 C# 的語言建構。 如需詳細資訊,請參閱 開始使用 C# 中的 LINQ。
  • 查詢運算式中的變數全都是強式型別變數,不過在許多情況下您並不需要明確提供型別,因為編譯器可以推斷其型別。 如需詳細資訊,請參閱LINQ 查詢作業中的類型關聯性 (C#)。
  • 在您使用 foreach 迴圈逐一查看迴圈中的查詢變數之前,查詢都不會執行。 如需詳細資訊,請參閱LINQ 查詢簡介 (C#)。
  • 在編譯時期,查詢運算式會依據 C# 規格中所訂立的規則,轉換成「標準查詢運算子」方法呼叫。 可以使用查詢語法表示的任何查詢也都可以使用方法語法來表示。 不過,在大部分的情況下,查詢語法的可讀性較高,也較為精簡。 如需詳細資訊,請參閱 C# 語言規格和標準查詢運算子概觀。
  • 撰寫 LINQ 查詢時,我們建議您盡可能使用查詢語法,必要時才使用方法語法。 這兩種不同的形式在語意或效能上並沒有任何差異。 查詢運算式的可讀性通常高於以方法語法撰寫的對等運算式。
  • 某些查詢作業 (例如 Count 或 Max) 並沒有對等的查詢運算式子句,因此必須以方法呼叫來表示。 方法語法可以透過各種方式與查詢語法合併使用。 如需詳細資訊,請參閱LINQ 中的查詢語法及方法語法 (C#)。
  • 根據查詢所套用的型別而定,查詢運算式可以編譯成運算式樹狀架構或委派。 IEnumerable<T> 查詢會編譯成委派。 IQueryable 和 IQueryable<T> 查詢則會編譯成運算式樹狀架構。 如需詳細資訊,請參閱 運算式樹狀架構 (C# 和 Visual Basic)。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言