別個のテーブルにマップされたエンティティのクエリ方法
概念モデルでレガシ データを使用するとき、単一のエンティティをデータベース内の 2 つのテーブルにマップできると便利な場合があります。 これは、SQL Server 2005 に付属する AdventureWorks サンプル データベースの Customer テーブルと Store テーブルのように、2 つのテーブルが共通のキーを共有している場合に実現できます。
このトピックで例として挙げたコードでは、「方法: 単一のエンティティが 2 つのテーブルにマップされたモデルを定義する」で定義した概念モデルを使用しています。 2 つのテーブルにマップされたエンティティに対してオブジェクト クエリを実行することは、他のエンティティを照会することと同じです。 マッピングはコードの構文に影響しません。
別個のテーブルにマップされたエンティティを使用してプロジェクトを作成するには
コンソール アプリケーションを作成します。
「方法: 単一のエンティティが 2 つのテーブルにマップされたモデルを定義する」で定義した概念モデルへの参照を追加します。
System.Data.Entity および System.Runtime.Serialization の参照を追加します。
「方法: 単一のエンティティが 2 つのテーブルにマップされたモデルを定義する」で実装した AdventureWorksModel のプリプロセッサ ディレクティブを追加します。
例
この例の別個のテーブルにマップされたエンティティを使用すると、foreach ループを使って結果を列挙できます。 次のコードを実行すると、Store エンティティ マッピングの両方のテーブルからのプロパティが表示されます。
Option Explicit On
Option Strict On
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports StoreCustomer_VB.AdventureWorksModel
Module Module1
Sub Main()
Using objCtx As AdventureWorksEntities =
New AdventureWorksEntities()
For Each store As Store In objCtx.Store
Console.WriteLine("CustomerId: {0} Name: {1} " & vbNewLine _
& vbTab & "Account#: {2} SalespersonId: {3}", _
store.CustomerID, store.Name, store.AccountNumber, store.SalesPersonID)
Console.Write(vbNewLine)
Next
End Using
End Sub
End Module
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AdventureWorksModel;
namespace ClientStoreCustomerSplit
{
class Program
{
static void Main(string[] args)
{
using (AdventureWorksEntities objCtx = new AdventureWorksEntities())
{
foreach (Store store in objCtx.Store)
Console.WriteLine("CustomerId: {0} Name: {1} \r\n\t" +
"Account#: {2} SalespersonId: {3}",
store.CustomerID, store.Name,
store.AccountNumber, store.SalesPersonID );
}
}
}
}