.NET TIPS
[LINQ to SQL]関連するテーブル内容を先に読み込んでおくには?[3.5、C#、VB]
デジタルアドバンテージ 遠藤 孝信
2009/10/29
「TIPS:LINQ to SQLにより生成されるSQL文を確認するには? 」に掲載しているサンプル・プログラムでは、その実行結果から分かるように、以下のような1つのクエリの実行に関して、合計で5つのSELECT文が実行されている。
// LINQによる問い合わせ
var records =
from n in dc.Orders
where n.ShipCountry == "Norway"
select n;
' LINQによる問い合わせ
Dim records = _
From n In dc.Orders _
Where n.ShipCountry = "Norway" _
Select n
サンプル・プログラムのクエリ部分(上:C#、下:VB)
これはクエリ結果の表示時に、以下のようにして、クエリ対象であるOrdersテーブルに関連付けられた、別のテーブルであるEmployeesテーブルのレコードにもアクセスしているためだ(
の行)。
// 問い合わせ結果の表示
foreach (var r in records)
{
Console.WriteLine(r.OrderID);
Console.WriteLine(r.Employees.LastName);
}
' 問い合わせ結果の表示
For Each r In records
Console.WriteLine(r.OrderID)
Console.WriteLine(r.Employees.LastName)
Next
サンプル・プログラムのクエリ結果表示部分(上:C#、下:VB)
このコードのように、関連のある別テーブルに頻繁にアクセスすることがあらかじめ分かっている場合には、その別テーブルのレコードも(最初のSELECT文発行時に)同時に取得するように指定できる。これにはデータコンテキストのLoadOptionsプロパティを指定する。
データコンテキストのLoadOptionsプロパティ
データコンテキストのLoadOptionsプロパティには、DataLoadOptionsクラス(System.Data.Linq名前空間)のオブジェクトを指定する。このオブジェクトでは、LoadWithメソッドを使って、同時に取得するデータを指定する。
例えば、クエリ対象となるテーブルが「Orders」で、これと同時にデータを取得したい関連するテーブルが「Employees」の場合、DataLoadOptionsクラスをインスタンス化し、LoadWithメソッドを呼び出す部分のコードは次のようになる。
// Employeesテーブルの即時読み込み
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Orders>(o => o.Employees);
' Employeesテーブルの即時読み込み
Dim dlo As New DataLoadOptions()
dlo.LoadWith(Of Orders)(Function(o As Orders) o.Employees)
DataLoadOptionsクラスのインスタンス化の例(上:C#、下:VB)
LoadWithメソッドの引数は、ラムダ式を使用している。
このコードを、「TIPS:LINQ to SQLにより生成されるSQL文を確認するには? 」のサンプル・プログラムに適用すると次のようになる。
using System;
using System.Linq;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// NorthWindDataContextクラスはVS 2008により自動生成
NorthWindDataContext dc = new NorthWindDataContext();
// LINQによる問い合わせ
var records =
from n in dc.Orders
where n.ShipCountry == "Norway"
select n;
dc.Log = Console.Out; // 標準出力にログを出力
// Employeesテーブルの即時読み込み
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Orders>(o => o.Employees);
dc.LoadOptions = dlo;
// 問い合わせ結果の表示
foreach (var r in records)
{
Console.WriteLine(r.OrderID);
Console.WriteLine(r.Employees.LastName);
}
Console.ReadLine();
}
}
}
Module Module1
Sub Main()
' NorthWindDataContextクラスはVS 2008により自動生成
Dim dc As New NorthWindDataContext()
' LINQによる問い合わせ
Dim records = _
From n In dc.Orders _
Where n.ShipCountry = "Norway" _
Select n
dc.Log = Console.Out ' 標準出力にログを出力
' Employeesテーブルの即時読み込み
Dim dlo As New DataLoadOptions()
dlo.LoadWith(Of Orders)(Function(o As Orders) o.Employees)
dc.LoadOptions = dlo
' 問い合わせ結果の表示
For Each r In records
Console.WriteLine(r.OrderID)
Console.WriteLine(r.Employees.LastName)
Next
Console.ReadLine()
End Sub
End Module
OrdersテーブルとEmployeesテーブルを同時に読み込むサンプル・プログラム(上:C#、下:VB)
「TIPS:LINQ to SQLにより生成されるSQL文を確認するには? 」のサンプル・プログラムを修正している。このコードの実行方法については、そちらのTIPSを参照してほしい。
このコードの実行結果は次のようになる。
上記サンプル・プログラムの実行結果例
この画面から、発行されているSELECT文が1つだけになっているのを確認できる。また、SELECT文ではOrdersテーブルとEmployeesテーブルの両方のデータを取得しているのも確認できる。
利用可能バージョン: .NET Framework 3.5以降
カテゴリ: クラス・ライブラリ 処理対象: LINQ
使用ライブラリ: DataContextクラス(System.Data.Linq名前空間)
使用ライブラリ: DataLoadOptionsクラス(System.Data.Linq名前空間)
generated by
TechTargetジャパン
キャリアアップ
**先週の人気講座ランキング**
〜 Android編 〜