EntityFramework(CodeFirst)でJoinを試してみる |
・VisualStudio 2012 C#
・EntityFramework 6.0.1
・SQLServer2012
「EntityFrameworkって
検索すると全カラムを抽出されて
Entityインスタンスの
全プロパティに反映されるんでしょ?
それに一度に1テーブルしか検索できないから
親子関係の情報とか一度に検索できないでしょ?
SQLを直接発行したほうがいいんじゃない?」
とEntityFrameworkを使えない子扱いされたので
本当に使えない子なのか、検証してみました。
今回は親子関係のある2つのテーブルで下記の確認を行います。
・JOIN句が含まれるSQLが発行され、
一度に親子テーブルを検索できるか?
・全カラムを抽出せず、
必要なカラムのみ抽出できるか?
まずはテーブル構造
EntityFramework周りのソースコード
//Parentクラス
public class Parent
{
public Parent()
{
this.Child = new HashSet<Child>();
}
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Child> Child { get; set; }
}
//Childクラス
public class Child
{
public int ID { get; set; }
public string Name { get; set; }
[ForeignKey("Parent")]
public int ParentID { get; set; }
public virtual Parent Parent { get; set; }
}
//DataContextクラス
public class DataContext:DbContext
{
public DbSet<Parent> Prarent { set; get; }
public DbSet<Child> Child { set; get; }
}
DataContextインスタンス経由で
「Child.PersonIDが1」のPersonとChildのNameを取得します。
//クエリ式のケース
using (DataContext dbContext = new DataContext())
{
var result =
from p in dbContext.Prarent
join c in dbContext.Child
on p.ID equals c.ParentID
where c.ParentID == 1
select new { p.Name, ChildName = c.Name };
foreach (var item in result)
{
//~処理~
//下記で情報を取得できる
//item.Name:Person.Name
//item.ChildName:Child.Name
}
}
//拡張メソッドのケース
using (DataContext dbContext = new DataContext())
{
var result =
dbContext.Prarent.Join(
dbContext.Child,
p=>p.ID,
c=>c.ParentID,
(p,c)=>new{p.ID,p.Name,ChildName=c.Name})
.Where(where=>where.ID==1);
foreach (var item in result)
{
//~処理~
//下記で情報を取得できる
//item.Name:Person.Name
//item.ChildName:Child.Name
}
}
下記と同等のSQLが発行されます。
select
p.ID,
p.Name,
c.Name as ChildName
from Parent as p
inner join Child as c
on p.ID = c.ParentID
where 1 = c.ParentID;
以上のことから、冒頭の確認結果は
下記のとおりとなりました。
・JOIN句が含まれるSQLが発行され、
一度に親子テーブルを検索できるか?
→クエリ式のjoinや拡張メソッドのJoinを
使うことで可能。
・全カラムを抽出せず、
必要なカラムのみ抽出できるか?
→抽出可能。別名をつけることも可能。
Linqを上手く使えば
EntityFrameworkはちゃんと答えてくれる
ということがわかりました。
EntityFrameworkは使えない子じゃなかった!
参考になれば幸いです。
よかったらクリックしてください。
にほんブログ村