iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 20
0

LINQ優點與缺點

優:

  • 方法導向,容易了解查詢的條件
  • 語法型態及查詢方式都是單一且一致,不需要會寫sql的語法,也可以避免用字串方式組SQL語法
  • Compile時可以很快發現錯誤,提升查詢程式正確性與品質,不像ADO.NET只是單純傳送SQL字串到SQL Server,若有任何錯誤也是在Runtime執行時才發現
    缺:
  • 查詢條件不熟,容易被過量使用,及時你只是要用在一個很簡單的方法
  • 有些複雜的語法只有在SQL中能做到
  • 容易寫出沒有效能的code

不管用哪個語法都代表著你會到server進行一次查詢,那麼每次查詢都需要時間,有時候會因為方便而徒增了與db的連結,造成執行時間上的影響。

常用的方法語法(Method syntax)

  • First 抓第一個項目
  • FirstOrDefault
  • Last 抓最後一個項目
  • LastOrDefault
  • ElementAt(index) 序列中第index個值
  • ElementAtOrDefault
  • Single 序列中是否只有唯一值
  • SingleOrDefault

從上面8種查詢方法可以看到其實只有4種不一樣,但另外4種多了OrDefault,但影響的只有查詢的結果。
一般的查詢方法,如果找不到資料時會在執行時期拋出 InvalidOperationException 例外
加了OrDefault 則會回傳 TSource 的預設值,代表查詢的結果能有null的結果。

class Program
    {
        static void Main(string[] args)
        {
            var clients = new List<Client>
            {
                new Client {ClientId=1,Name="Harry" },
                new Client {ClientId=2,Name="Bob" },
                new Client {ClientId=3,Name="Ben" },
                new Client {ClientId=4,Name="Charlie" },
            };            
        }
        public class Client
        {
            public int ClientId { get; set; }
            public string Name { get; set; }
        }
    }

以上面這個List做查詢示範

var clientA = clients.First();
var clientB = clients.FirstOrDefault(f => f.ClientId>0);            

假如把clients的內容清空,則clientA程式會拋出例外出錯,clientB卻是回傳null的參數

我們用try-catch可以看到結果

try
            {
                var result = (from r in clients
                              where
                                  r.Name == "David"
                                  select r).First();
            }
            catch (InvalidOperationException ex)
            {
                Console.WriteLine(ex.Message);
            }

ex.Message會顯示,序列未包含項目,代表說查詢結果是沒有資料的,因此我們在選擇用法時,如果確定此查詢絕對有值,我們即可用first,但如果他可能會有null的情況,我們就可以透過OrDefault做而外的處理

var clientB = clients.FirstOrDefault(f => f.ClientId > 0);
if(clientB !=null){
//做處理
}else{
//沒資料的狀況處理
}

Any()、Count()

如果List clients有任何值則回傳true,並透過count()查詢有幾筆資料

            if (clients.Any())
            {
                Console.WriteLine("Clients有" + clients.Count() + "個會員");
            }
            
            結果 "Clients有4個會員"

還有很多種方法Skip、Take等等可以使用,大總體來說LINQ讓entityFramework的查詢方法不會像以前麵條式的sql語法,反而還可以從執行的查詢方法就可以清楚的知道,整行是需要撈取什麼情境的資料。

學習網站:

msdn:https://www.asp.net/web-forms/videos/data-access
tutorial:http://www.tutorialspoint.com/linq/


上一篇
Day19_LINQ前序
下一篇
Day21_Repository Pattern介紹
系列文
從Asp.Net MVC5的起跑點認識現代網站30

尚未有邦友留言

立即登入留言