星期二, 6月 22, 2010

抓取關聯 Table 的資料

最近在玩 Entity Framework 這個不錯的 ORM 技術,學著自己處理一些簡單的增刪查改的動作,發現還真的不錯用,尤其想到以後可以用到不同的資料庫,又可以用相同的處理手法,就覺的是很不錯的投資,不過也有發現一些需要注意的問題,我用個範例來說明一下..

這是簡單的資料表關聯圖..

image

--我想由TableA抓出TableD--

直接下語法,取出資料..

var data = db.TableA;
foreach (var tableA in data)
{
Console.WriteLine("TableA" + tableA.TableName);
foreach (var tableB in tableA.TableB)
{
Console.WriteLine("--TableB--" + tableB.TableName);
foreach (var tableC in tableB.TableC)
{
Console.WriteLine("----TableC----" + tableC.TableName);
foreach (var tableD in tableC.TableD)
{
Console.WriteLine("------" + tableD.TableName + "-------");
}
}
}
Console.WriteLine("*************");
}

它跑出的 SQL Statement

image

上圖可以看出是一個一個迴圈去下SQL Statement,這樣在筆數多的時候,效能可能會非常低落,這種方式只適合在某一個條件下去取出資料,才是比較對的選擇..

我們換另一種方式用 Include 的方式去把它一次載出來..

var data = db.TableA.Include("TableB.TableC.TableD");
foreach (var tableA in data)
{
Console.WriteLine("TableA" + tableA.TableName);
foreach (var tableB in tableA.TableB)
{
Console.WriteLine("--TableB--" + tableB.TableName);
foreach (var tableC in tableB.TableC)
{
Console.WriteLine("----TableC----" + tableC.TableName);
foreach (var tableD in tableC.TableD)
{
Console.WriteLine("------" + tableD.TableName + "-------");
}
}
}
}

這樣一次就下完所有的SQL Statement,把所有的資料都抓出來,效能一定比一筆一筆下好..

image

還有另一種方式也可以一次把資料都抓出來,就是用匿名型別的方法..

var data = db.TableA.Select(a => new
{
tableA = a,
tableB = a.TableB,
tableC = a.TableB.Select(b => b.TableC),
tableD = a.TableB.Select(b => b.TableC.Select(c => c.TableD))
});
foreach (var item in data)
{
Console.WriteLine("TableA" + item.tableA.TableName);
foreach (var tableB in item.tableA.TableB)
{
Console.WriteLine("--TableB--" + tableB.TableName);
foreach (var tableC in tableB.TableC)
{
Console.WriteLine("----TableC----" + tableC.TableName);
foreach (var tableD in tableC.TableD)
{
Console.WriteLine("------" + tableD.TableName + "-------");
}
}
}
Console.WriteLine("*************");
}

下圖的 SQL Statement 是醜了點,也沒有 Include 簡潔有利,但是不失為一個好方法..

image

這幾種抓取資料的方法,提供大家參考一下,有啥問題也可提出來一起討論看看..

沒有留言: