昨天跟顧問討論著公司開發平台從下sql到寫Linq的各種心得
不禁有感而發
當初剛接觸Entity Framework和Linq時(公司則是用Telerik公司的DataAccess)
因為對IEnumerable和IQueryable的認知不清吃了不少效能上的悶虧
這兩樣東西的差別在於
IEnumerable :已執行Linq條件而產生的SQL,並將資料儲存在記憶體裡
IQueryable : 是一個指令的集合體,並沒有真的執行向資料庫取資料的動作
這一篇的重點應該就只有這兩句了
那到底該用哪個?這問題真是很難回答
只能看運用時機自己應變
舉個小例子
寫法一
var data = (from m in context.Members
join tm in context.TeamMembers
on m.MemberID equals tm.MemberID
join t in context.Teams
on tm.TeamID equals t.TeamID
where m.MemberID == memberid
select new { m, tm, t}).ToList();
foreach (var team in teamList)
{
var m = data.tm.Where(c => c.tm.TeamID==team).First();
//Do Something
}
寫法二
var data = (from m in context.Members
join tm in context.TeamMembers
on m.MemberID equals tm.MemberID
join t in context.Teams
on tm.TeamID equals t.TeamID
where m.MemberID == memberid
select new { m, tm, t});
foreach (var team in teamList)
{
var m = data.tm.Where(c => c.tm.TeamID==team).First();
//Do Something
}
大家來找碴
兩段程式的差別只在於寫法一多了一個ToList()
但背後實際執行起來卻大有差異
寫法一是在loop外面執行一次取資料
loop裡面的where都是針對記憶體裡的List在做處理
寫法二則是loop裡面每一個where才去跟資料庫要一次資料
還是如同前面所說的
哪一個比較好真的要看情況
真的不知道哪個好,那就兩種都跑跑看比較performance吧!!