優:
不管用哪個語法都代表著你會到server進行一次查詢,那麼每次查詢都需要時間,有時候會因為方便而徒增了與db的連結,造成執行時間上的影響。
從上面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{
//沒資料的狀況處理
}
如果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/