1. 程式人生 > >什麼是Linq,什麼是Lambda表示式?他們的區別和共同點是什麼?

什麼是Linq,什麼是Lambda表示式?他們的區別和共同點是什麼?

一、什麼是Linq,Lambda

整理自 https://www.cnblogs.com/dotnet261010/p/8278793.html
PS:下面臭長臭長的東西可以不看的,直接翻下去看程式碼更好理解
Linq:
1、面向物件與資料訪問兩個領域長期分裂,各自為政。

2、程式語言中的資料型別與資料庫中的資料型別形成兩套不同的體系,例如:

C#中字串用string資料型別表示。

SQL中字串用NVarchar/Varchar/Char資料型別表示。

3、SQL編碼體驗落後

沒有智慧感知效果。

沒有嚴格意義上的強型別和型別檢查。

4、SQL和XML都有各自的查詢語言,而物件沒有自己的查詢語言。

上面描述的問題,都可以使用LINQ解決,那麼究竟什麼是LINQ呢?

1、LINQ(Language Integrated Query)即語言整合查詢。

2、LINQ是一組語言特性和API,使得你可以使用統一的方式編寫各種查詢。用於儲存和檢索來自不同資料來源的資料,從而消除了程式語言和資料庫之間的不匹配,以及為不同型別的資料來源提供單個查詢介面。

3、LINQ總是使用物件,因此你可以使用相同的查詢語法來查詢和轉換XML、物件集合、SQL資料庫、ADO.NET資料集以及任何其他可用的LINQ提供程式格式的資料。
4、Linq從另一方面來說也有效地防止了Sql注入哈哈

LINQ主要包含以下三部分:

1、LINQ to Objects 主要負責物件的查詢。

2、LINQ to XML 主要負責XML的查詢。

3、LINQ to ADO.NET 主要負責資料庫的查詢。

LINQ to SQL

LINQ to DataSet

LINQ to Entities
  
Lambda表示式:
1、簡化了匿名委託的使用。
2、Lambda讓我們的程式碼更加的簡介與方便,可以方便的用Where()、Select()等擴充套件方法對集合進行篩選,組合

下面我們來舉個栗子 :

在這裡插入圖片描述
1.兩者 簡單的語法

   static void Main(string[] args)
        {
            int[] scores = { 90, 71, 82, 93, 75, 81 };
            //查大於80分的成績
            var result = from s in scores
                         where s > 80
                         select s;   //Linq寫法
                         
            var result1 = scores.Where(s => s > 80);   //lambda表示式寫法
        }
        
        Linq基本語法: from  s  in  資料來源  
                  where  條件語句 
                  select  要查的結果
        s 是隨便起的一個名字,代表這個資料來源
        
        Lambda基本語法:
        所有的lambda表示式都是用新的lambda運算子 " => ",可以叫他,“轉到”或者 “成為”。
        運算子將表示式分為兩部分,左邊指定輸入引數
        右邊是lambda的主體,一些篩選語句等等,可以簡單的理解為sql裡面的where條件

2.簡單的排序

   static void Main(string[] args)
        {
            int[] scores = { 90, 71, 82, 93, 75, 81 };
            //查大於80分的成績
            var result = from s in scores
                         where s > 80 
                         orderby s descending //倒序  正序為ascending
                         select s;
            var result1 = scores.OrderByDescending(s=>s).Where(s => s > 80);//倒序
            var result1 = scores.OrderBy(s=>s).Where(s => s > 80);//正序
        }

3.簡單的函式計算

       int[] scores = { 90, 71, 82, 93, 75, 82 };
            //查大於80分的成績和
            var result = (from s in scores
                         where s > 80 
                         select s).Sum();
            var result1 = scores.Where(s => s > 80).Sum();

4.分頁查詢

       var result= (from r in db.Product
                      where r.rpId > 10
                      orderby r.rpId descending
                      select r).Skip(10).Take(10); //取第11條到第20條資料    
       var result1 = db.Product.OrderByDescending(p => p.rpId).Where(p => p.rpId > 10).Skip(10).Take(10).ToList();
         
       //PS:忘了從哪看到的了,這個ToList在讀表資料時候是要寫的。另外lambda表示式跟EF很配。

5、包含,類似like ‘%%’

  var ss = from r in db.Product
                     where r.SortsText.Contains("來源")
                     select r;
  var ss1 = db.Product.Where(p => p.SortsText.Contains("來源")).ToList();

6、篩選欄位中不相同的值。用於查詢不重複的結果集

int[] scores = { 90, 71, 82, 93, 75, 90 };

            var result = (from s in scores
                         where s > 80
                         select s).Distinct(); 
            var result1 = scores.Distinct().Where(s => s > 80);

7、分組

var sums2 = from emp in empList
            group emp by new { emp.Age, emp.Sex } into g
            select new { Peo = g.Key, Count = g.Count() };
            
 var sums = empList
         .GroupBy(x => new { x.Age, x.Sex })
         .Select(group => new {
            Peo = group.Key, Count = group.Count()
         });
  

8、連線查詢

  var ss = from p in db.Product
                     join s in db.ShoppingCart on p.Id equals s.pId
                     select r;
                     
  var ss1 = db.Product.Join(db.ShoppingCart , p => p.Id, r => r.pid, (p, r) => p).ToList();
            //3