一、LINQ簡介


LINQ簡介

一、什么是LINQ

長期以來,開發社區形成以下的格局:
1、面向對象與數據訪問兩個領域長期分裂,各自為政。

2、編程語言中的數據類型與數據庫中的數據類型形成兩套不同的體系,例如:
  C#中字符串用string數據類型表示。
  SQL中字符串用NVarchar/Varchar/Char數據類型表示。

3、SQL編碼體驗落后
  沒有智能感知效果。
  沒有嚴格意義上的強類型和類型檢查。

4、SQL和XML都有各自的查詢語言,而對象沒有自己的查詢語言。
上面描述的問題,都可以使用LINQ解決,那么究竟什么是LINQ呢?
LINQ(Language Integrated Query)即語言集成查詢。
LINQ是一組語言特性和API,使得你可以使用統一的方式編寫各種查詢,它在對象領域和數據領域之間架起了一座橋梁。用於保存和檢索來自不同數據源的數據,從而消除了編程語言和數據庫之間的不匹配,以及為不同類型的數據源提供單個查詢接口。
LINQ總是使用對象,因此你可以使用相同的查詢語法來查詢和轉換XML、對象集合、SQL數據庫、ADO.NET數據集以及任何其他可用的LINQ提供程序格式的數據。

LINQ主要包含以下三部分:
1、LINQ to Objects 主要負責對象的查詢。
2、LINQ to XML 主要負責XML的查詢。
3、LINQ to ADO.NET 主要負責數據庫的查詢。
  LINQ to SQL
  LINQ to DataSet
  LINQ to Entities

二、LINQ的優勢

1、熟悉的語言:開發人員不必為每種類型的數據源或數據格式學習新的語言。
2、更少的編碼:相比較傳統的方式,LINQ減少了要編寫的代碼量。
3、可讀性強:LINQ增加了代碼的可讀性,因此其他開發人員可以很輕松地理解和維護。
4、標准化的查詢方式:可以使用相同的LINQ語法查詢多個數據源。
5、類型檢查:程序會在編譯的時候提供類型檢查。
6、智能感知提示:LINQ為通用集合提供智能感知提示。
7、整形數據:LINQ可以檢索不同形狀的數據。

三、LINQ的操作步驟

所有的Linq查詢操作都由以下三個不同的操作組成:
1.獲得數據源
想要使用Linq進行查詢,數據源必須支持IEnumerable或IEnumerable(T)泛型接口或派生接口(如泛型的IQueryable(T)接口)。
2.創建查詢

查詢指定要從數據源中檢索的信息
查詢還可以指定在返回這些信息之前如何對其進行排序、分組和結構化
查詢存儲在查詢變量中,並用查詢表達式進行初始化。為使編寫查詢的工作更加容易,C#引入了新的查詢語法
3.執行查詢

查詢變量本身只是存儲查詢命令。實際的查詢執行會延遲在foreach語句中循環訪問變量時發生。此概念稱為“延遲執行”。
強制立即執行,可以通過以下兩個方法,使得Linq立即執行查詢
執行聚合函數(Count、Max、Average、First)。
調用ToList(<T>Source)或ToArray(<T>Source)方法緩存結果。

四、LINQ的案例

案例一:

學生類

    //學生類
    public class Student
    {
        private string name;
        private List<int> score;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }

        public List<int> Score
        {
            get
            {
                return score;
            }
            set
            {
                score = value;
            }
        }
    }

 數據查詢

           //數據源
IList<Student> students = new List<Student>
{
    new Student{ Name="Kevin", Score=new List<int>{89,93,88,78}},
    new Student{ Name="Jackie",Score=new List<int>{92,87,83,91}},
    new Student{ Name="Helen",Score=new List<int>{53,76,72,62}}
};
            //所有的Linq查詢操作都由以下三個不同的操作組成:
            //1.獲得數據源
            //2.創建查詢
            //3.執行查詢

            //使用復合from子句查詢命令
            var getStudent =
                    from student in students
                    from score in student.Score
                    where score > 90
                    select new { Name = student.Name, Score = score };

            foreach (var st in getStudent)
            {
                Console.WriteLine("NAME:{0},SCORE:{1}",st.Name,st.Score);
            }

結果:

我們可以看到學生對象中有個Score屬性,Score屬性本身就是List集合,這時候我們就要用到復合from子句進行查詢了。首先遍歷學生對象集合中的每個學生對象,然后在用另一個from子句,對每個學生對象中的Score屬性進行遍歷,篩選出含有90分以上的學生信息進行返回。

案例二:

namespace Demo
{
    // 定義委托
    delegate bool FindEven(int item);

    class IntExtension
    {
        public static int[] where(int[] array, FindEven dele)
        {
            int[] result = new int[5];
            int i = 0;
            foreach (int item in array)
            {
                if (dele(item))//調用下面的 delegate (int item)
                {
                    result[i] = item;
                    i++;
                }
            }

            return result;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            // 查詢出數組中的偶數並排序
            int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 };

            //delegate(int item){return item % 2 == 0;}表示委托的實現
            List<int> list = IntExtension.where(ints, delegate (int item)
            {
                return item % 2 == 0;
                //return item % 2 != 0; 奇數
            }).ToList();
            // 正序排序
            list.Sort();
            // 反轉
            list.Reverse();
            // 輸出
            Console.WriteLine(string.Join(",", list));

            Console.ReadKey();
        }
    }
}

 結果:

通過泛型委托實現對Int數組ints實現偶數輸出並排序;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM