Linq表達式、Lambda表達式你更喜歡哪個?

来源:http://www.cnblogs.com/zhaopei/archive/2016/08/08/5746414.html
-Advertisement-
Play Games

什麼是Linq表達式?什麼是Lambda表達式? 如圖: 由此可見Linq表達式和Lamdba表達式並沒有什麼可比性。 那與Lamdba表達式相關的整條語句稱作什麼呢?在微軟並沒有給出官方的命名,在《深入理解C#》中稱為點標記。 ...


什麼是Linq表達式?什麼是Lambda表達式?

如圖:

由此可見Linq表達式和Lamdba表達式並沒有什麼可比性。

那與Lamdba表達式相關的整條語句稱作什麼呢?在微軟並沒有給出官方的命名,在《深入理解C#》中稱為點標記

查詢表達式、點標記你更喜歡哪個?

所以,我們的標題的提問根本就不合適。應該是“Linq查詢表達式和點標記你更喜歡哪個?”。如:

 //查詢表達式
 var students1 = from t in db.Students
                where t.Name == "張三"
                select new { t.Id, t.Name, t.Age };
 //點標記
 var students2 = db.Students
                 .Where(t => t.Name == "張三")
                 .Select(t => new { t.Id, t.Name, t.Age });

為什麼選擇點標記 

我相信更多的人偏向選擇點標記。具體什麼原因我也說不清(可能是點標記中的Lamdba更加優雅吧)。對於我個人來說,也是更加喜歡點標記這種方式。

1、所有的查詢表達式都可以轉成對應的點標記。反之,不是所有的點標記都可以轉成查詢表達式。

為什麼?因為查詢表達式在編譯後就直接變成了點標記:(以下是上面兩個語句對應的編譯後的反編譯C#代碼

生成了一模一樣的代碼。(由於是編譯後的,好多亂七八糟的代碼。我們只看Where和Select關鍵字就知道,使用的都是點標記。

2、點標記確實比查詢表達式更加優雅

例一:

 //查詢表達式
 var students1 = from t in db.Students
                 where t.Name == "張三"
                 select t;
 //點標記
 var students2 = db.Students
                 .Where(t => t.Name == "張三");

我為什麼一定要 select t 啊,這句沒卵用的廢話就不能省嗎?是的,省了就報錯:

例二:

必須需要括弧包裹起來才能取結果集?你還能更醜一點嗎?

//查詢表達式
var students1 = (from t in db.Students
                 where t.Name == "張三"
                 select t).ToList();
//點標記
var students2 = db.Students
                .Where(t => t.Name == "張三")
                .ToList();       

例三:為什麼說:"不是所有的點標記都可以轉成查詢表達式"【此例只適用於IEnumerator】)

此條點標記你能轉成查詢表達式嗎?

var list = new List<string>() { "張三", "張三", "張三", "張三", "李四", "張三", "李四", "張三", "李四" };

var students2 = list
                .Where((item, index) => item == "張三" && index % 2 == 0)
                .Select((item, index) => new { item, index })
                .ToList();

查詢表達式你能Reverse嗎?

var list = new List<string>() { "張三1", "張三2", "張三3", "張三0", "李四9", "張三3", "李四", "張三2", "李四" };

var students2 = list
             .Where((item, index) => item.Contains("張三"))
             .Select((item, index) => new { item, index })
             .Reverse()//反序
             .ToList();

什麼時候使用查詢表達式?

通過上面的對比,好像查詢表達式一文不值了。no,不是這樣的。

比如下麵幾種情況我們就可以選擇使用查詢表達式:

例一:本例適用於Linq to Object 和 沒有建主外鍵的EF查詢

點標記中的Join需要傳四個參數表達式,是不是有點暈了。。。

var list1 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "張三" }, { "4", "張三" } };
var list2 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "李四" }, { "4", "張三" } };

//查詢表達式
var obj1 = from l1 in list1
           join l2 in list2
           on l1.Key equals l2.Key
           select new { l1, l2 };
//點標記
var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 });

例二:

點標記需要區分OrderBy、ThenBy有沒有覺得麻煩

//查詢表達式
var obj1 = from l1 in list1
           join l2 in list2
           on l1.Key equals l2.Key
           orderby l1.Key, l2.Key descending
           select new { l1, l2 };
//點標記
var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 })
    .OrderBy(li => li.l1.Key)
    .ThenByDescending(li => li.l2.Key)
    .Select(t => new { t.l1, t.l2 });

總覺得查詢表達式更多的只是為了照顧那些寫慣了sql的程式員。

聯接查詢(內聯、左聯、交叉聯)

關於聯接查詢使用查詢表達式會更合適一些這個上面已經說了。

接下來我們寫內聯、左聯、交叉聯的查詢表達式和對應的點標記代碼。(目的:可能有些人不會,同時在這裡也給自己做個備忘)

內聯:

左聯:

交叉聯:

其實關於聯接查詢,如果EF建好了主外鍵我還是覺得點標記用起來更爽爽的。

總結:

本文並不是要改變你的習慣,也不是否定你的觀點。僅僅只是表達個人對點標記和查詢表達式的些許理解。

關於是使用查詢表達式還是點標記,可能起著更大決定性的作用的是團隊共同的習慣和規範。

然後還想說說,只要我們對比什麼,很可能就會有人跳出了,什麼不要比,用好了都一樣,什麼什麼才是最重要的,什麼什麼的。。。

就像很多人會反感java和C#的對比,其實我個人覺得對比下底層實現、對比下語法簡易也不是不可以的,只要我們可以從中學到知識(個人也是不喜歡對比 誰誰誰學什麼工資多少多少)。

昨天的自己對比今天的自己,今天的自己對比明天的自己。只要可以進步為什麼不要對比呢?

 

文章首鏈:http://www.cnblogs.com/zhaopei/p/5746414.html

感謝您的閱讀。如果文章對您有用,那麼請輕輕點個贊,以資鼓勵。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 其實,圖片預覽功能非常地常見。很意外,之前遇到上傳圖片的時候都不需要預覽,也一直沒有去實現過。現在手上的項目又需要有圖片預覽功能,所以就動手做了一個小插件。在此分享一下思路。 一、實現圖片預覽的一些方法。 瞭解了一下,其實方法都是大同小異的。大概有以下幾種方式: ①訂閱input[type=file ...
  • 一、變數的作用域要懂得閉包,起首必須懂得Javascript特別的變數作用域。變數的作用域無非就是兩種:全局變數和局部變數。Javascript說話的特別之處,就在於函數內部可以直接讀取全局變數。Js代碼 var n=999; function f1(){ alert(n); } f1(); // ...
  • DECLARE @tb1 Table( drive varchar(20), [MB 可用空間] varchar(20)) INSERT INTO @tb1 Exec master.dbo.xp_fixeddrives select drive , CAST( CAST((CAST([MB 可用空間 ...
  • ...
  • 聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com 希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~ 如果你感覺文章有幫助,點 ...
  • 存儲過程:就像函數一樣的會保存在資料庫中--》可編程性 --》 存儲過程創建存儲過程:create proc JiaFa--需要的參數@a int,@b intas --存儲過程的內容 declare @c int; set @c = @a + @b; return @c;go public int ...
  • .NET Core中間件的註冊和管道的構建(2) 用UseMiddleware擴展方法註冊中間件類 0x00 為什麼要引入擴展方法 有的中間件功能比較簡單,有的則比較複雜,並且依賴其它組件。除了直接用ApplicationBuilder的Use()方法註冊中間件外,還可以使用ApplicationB ...
  • It has being ages to get back to cnblogs, Career path had been changed back to .Net development in 4 years ago....Things i just leart from my current ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...