2016年1月29日 星期五

IEnumerable?IQueryable?

昨天跟顧問討論著公司開發平台從下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吧!!