前言
這篇是過去初學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運算式中:
- 左邊為帶入參數,右邊回傳結果。
- 若有多個參數,需要以逗號分隔。
- 可以指定型態。
- 若帶入參數為空白,需要以()表示。
(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.aspxhttp://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] 範例:一個新增、修改、刪除、查詢與檢視的應用程式
本篇文章內容歡迎分享,轉載與使用圖文請來信告知並註明出處。
0 留言