[Asp .Net MVC] Linq、Lambda 與 System.Linq.Enumerable 方法

熱門文章 (Popular Post)

Posted by : Duran Hsieh 4月 05, 2016


前言

這篇是過去初學Asp .Net MVC過程中的筆記,在取得Entity Framework資料庫物件、
資料運算與撰寫程式的Linq + Lambda方法。這篇不詳細說明原理,而大略紀錄如何
使用。若有錯誤的地方,歡迎各位先進指點,謝謝!

本篇文章有引用MSDN與WIKI部分說明,若有不妥,請告知。
本篇文章測試環境為visual studio community 2013:



Linq與Lambda簡易說明

Linq

依據微軟官方(MSDN))與Wiki說明,Linq是一種自然語言,用於對應SQL(資料)與
Entity framework(物件)間銜接的技術。對於資料查詢語法(如SQL、XML),在編譯
時期無法檢查型別與語法錯誤等問題,並且因應不同查詢技術,開發者必須學習
不同的語法,所產生出的解決方案。讓開發者無論在學習上或編譯過程中,只須
了解Linq方法,即可快速的展開工作。

下列為Linq的簡易範例:
int[] numbers = { 7, 3, 2, 1, 9, 8, 41, 3, 2, 1 };

// result is an IEnumerable
var result = from num in numbers
                   where num < 7
                   orderby num ascending
                   select num;

相較於原始使用foreach與if,linq的語法可讀性較高,讓維護工程師很快可以理解程式
目的,而語法結構與SQL有一些相似。
一些基本的使用方法如下:

Select:  回傳的呈現資料內容。
Orderby: 排序。
From: 一個查詢句的開端,可提供子查詢使用的物件。
Where: 條件篩選,類似 if 用法 。

透過linq的運用,我們可以取得entity framwork取得物件的內容,轉換成ViewModel
(DTO)或其他我們需要的資料格式,相當方便。



Lambda
依據微軟官方(MSDN)說法:Lambda 運算式是匿名函式,可用來建立委派或運算式樹
狀架構類型。這邊不詳細說明原理,有興趣的朋友可以自行搜尋相關內容,這裡只說
明使用方法。

Lambda運算式中:
  1. 左邊為帶入參數,右邊回傳結果。
  2. 若有多個參數,需要以逗號分隔。
  3. 可以指定型態。
  4. 若帶入參數為空白,需要以()表示。
下列為一些範例:
(x, y) => x == y
(int x, string s) => s.Length > x



進入正題
舉例來說,我們假設一個學生資料庫內容如下:
    [Table("StudentProfile")]
    public class StudentProfile
    {
        [Key]
        public Guid guid { get; set; }
        public string Id { get; set; }
        public string Name   { get; set; }
        public string Address { get; set; }
        public string Email { get; set; }
        public string Tel { get; set; }
        public string Message { get; set; }
    }



在使用linq方法之前,必須加上:
using System.Linq;


無論在使用code first 或database first 方式建立Model,在取得資料過程中,
皆可以使用System.Linq.Enumerable擴充方法進行(內使用Lambda運算式),
所以我們的查詢語法可以變成:

private StudentDbContext db = new StudentDbContext();
     
//取淂id為"m9938982"第一筆(或預設)的資料
var result = db.StudentProfile.FirstOrDefault(x => x.Id == "m9938982");

//取得姓名為duran的所有資料
var result = db.StudentProfile.Where(x => x.Name  == "duran");

//依據地址排序,取得所有資料
var result = db.StudentProfile.OrderBy(x=>x.Address);

//將取得的資料轉換成StudentViewModel
var result = db.StudentProfile.Select(x=> new StudentViewModel{
    guid = x.guid,
    ID = x.Id,
    NAME = x.Name,
    ADDRESS = x.Address,
    EMAIL=x.Email,
    TEL = x.Tel,
    MESSAGE = x.Message
});



感想

在第一次撰寫的時候有些不習慣,但深入了解與使用一陣子後,其實寫起來爽度頗
高的,當然,在前一間公司某些專案上仍有遭遇一些問題,需要改用SQL語法或
stored procedure(transaction與大量資料某些情境下),但在一般開發過程中,此種資
料運算的撰寫方法比起過去query的方式,較快速也更容易理解。


範例程式

https://github.com/superpucy/FcuMvcWebDemo2


參考資料

https://msdn.microsoft.com/zh-tw/library/bb397687.aspx
http://huan-lin.blogspot.com/2009/01/from-lambda-to-linq.html
https://msdn.microsoft.com/zh-tw/library/system.linq.enumerable_methods.aspx
https://msdn.microsoft.com/en-us/library/bb383978.aspx



上一篇:[Asp .Net MVC] Entity framework code first with localdb
下一篇:[Asp .Net MVC] 範例:一個新增、修改、刪除、查詢與檢視的應用程式



本篇文章內容歡迎分享,轉載與使用圖文請來信告知並註明出處。


Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Duran Hsieh @ Matsurigoto - Date A Live - Powered by Blogger - Designed by Johanes Djogan -