コードでのデータ関連オブジェクトの操作
LightSwitch は、データを説明するオブジェクトやメンバーを生成します。これらのオブジェクトとメンバーの名前は、ソリューション内のアイテムの名前と一致します。たとえば、Customer という名前のテーブルを追加すると、LightSwitch は Customer という名前のオブジェクトを生成します。このトピックでは、LightSwitch によって生成されるオブジェクトのそれぞれの種類について説明します。一般的なデータ関連のタスクを実行するためにこれらのオブジェクトおよびメンバーを使用するコード例を表示するには、「コードを使用したデータ関連タスクの実行」を参照してください。
生成されたオブジェクトおよびメンバーの階層構造
次の図では、生成されたオブジェクトと、データ モデルのメンバーの概要を示します。
アプリケーション
Application オブジェクトは、アプリケーション内のオブジェクトへのトップ レベル アクセスを提供します。Application オブジェクトにアクセスするには、コード エディターで任意のユーザー コード ファイルを開き、「Application」と入力します。「Application」と入力して「.」と入力した後に IntelliSense に表示されるメソッドとプロパティの種類は、コードを書いているコード ファイルによって変わります。ほとんどの場合、Application オブジェクトのプロパティを使用して、現在のユーザーを表すオブジェクトを取得できます。
データ ワークスペース
DataWorkspace オブジェクトは、すべてのデータ アクセスのトップレベル オブジェクトです。DataWorkspace オブジェクトには、プロジェクト内の各データ ソースのプロパティが含まれます。たとえば、NorthwindData という名前のデータ ソースがある場合は、LightSwitch は NorthwinddData という名前のプロパティを生成します。コード エディターで「DataWorkspace」と入力すると、ドロップダウン リストで [NorthwindData] プロパティが使用可能になります。
次の図では、ドロップダウン リストに表示される可能性のある生成メンバーを示します。
Data Source
LightSwitch はプロジェクトの各データ ソースのためにオブジェクトを生成します。このオブジェクトには、データへのアクセスに使用できるメンバーが含まれます。データ ソース オブジェクトのメンバーには、エンティティ セット プロパティとクエリ メソッドが含まれます。
次の図では、ドロップダウン リストに表示される可能性のある生成メンバーを示します。
エンティティ セット プロパティ
エンティティ セット プロパティはエンティティのコレクションを返します。LightSwitch は、データ ソースの各エンティティのためにエンティティ セット プロパティを生成します。たとえば、データ ソースに Customer という名前のエンティティがある場合、LightSwitch は Customers という名前のプロパティを生成します。Customers プロパティを使用して、Customer エンティティのコレクションを表す EntitySet オブジェクトを取得することができます。
EntitySet オブジェクトには、現在のユーザーがコレクション内のエンティティの読み取り、更新、または削除を許可されているかどうかを確認できるメンバーも含まれています。詳細については、「コードを使用したデータ関連タスクの実行」を参照してください。
[!メモ]
EntitySet は、いくつかのタイプのエンティティ コレクション オブジェクトの 1 つです。コードのパフォーマンスを最適化するには、記述するビジネス ロジックの種類に対応する正しい種類のエンティティ コレクション オブジェクトを使用します。詳細については、「エンティティ コレクション オブジェクトとパフォーマンス」を参照してください。
クエリ メソッド
クエリ メソッドはクエリの結果を取得します。LightSwitch は、データ ソースで定義されている各クエリのメソッドを生成します。メソッドの名前がクエリの名前と一致します。クエリは、単一のエンティティ、または IDataServiceQueryable タイプのエンティティのコレクションを返すことができます。
[!メモ]
IDataServiceQueryable<T> は、いくつかのタイプのエンティティ コレクション オブジェクトの 1 つです。コードのパフォーマンスを最適化するには、記述するビジネス ロジックの種類に対応する正しい種類のエンティティ コレクション オブジェクトを使用します。詳細については、「エンティティ コレクション オブジェクトとパフォーマンス」を参照してください。
既定では、LightSwitch はデータ ソース内の各エンティティに対して次のクエリ メソッドを生成します。
<エンティティ名>_Single。
<エンティティ名>_SingleOrDefault。
これら両方のメソッドは、プライマリ キー セグメントを受け入れ、1 つのエンティティ オブジェクトを返します。エンティティが返されない場合、<エンティティ名>_Single メソッドは例外をスローするのに対して、<エンティティ名>_SingleOrDefault メソッドは Null 値 (Visual Basic では Nothing) を返します。
エンティティ
LightSwitch は、エンティティ コレクションの各エンティティのために EntityObject を生成します。たとえば、コードが注文のコレクションを取得した場合、コレクションには互いを示す EntityObject が含まれます。EntityObject には、エンティティの削除、エンティティ プロパティの値の読み取りや更新、または関連エンティティの取得に使用できるメンバーが含まれます。EntitySet などのエンティティ コレクション オブジェクトから EntityObject を取得することもできますし、エンティティを返すクエリ メソッドを呼び出して取得することもできます。詳細については、「コードを使用したデータ関連タスクの実行」を参照してください。
次の例では、myOrder という名前の Order エンティティのメンバーを示します。Order エンティティには、OrderDate, OrderID や Freight といったエンティティ プロパティがあります。Order エンティティにも、関連する Order_Details コレクションと、注文を行った Customer を取得するために使用できるメンバーがあります。
この例では、Customer プロパティは、Customer エンティティを返します。Customer エンティティは Customer-Order リレーションシップの 1 つの側にあります。
Order_Details プロパティは Order_Details エンティティのコレクションを返します。Order_Details エンティティは、Order-Order_Details リレーションシップの複数の側にあります。Order_Details コレクション オブジェクトの型は EntityCollection です。
この図はまた、Order_DetailsQuery という名前のプロパティを示しています。Query という単語で終わるプロパティは IDataServiceQueryable オブジェクトを返します。
[!メモ]
EntityCollection と IDataServiceQueryable はどちらもエンティティ コレクション オブジェクトの種類です。コードのパフォーマンスを最適化するには、記述するビジネス ロジックの種類に対応する正しい種類のエンティティ コレクション オブジェクトを使用します。詳細については、「エンティティ コレクション オブジェクトとパフォーマンス」を参照してください。
エンティティ コレクション オブジェクトとパフォーマンス
LINQ 式でエンティティ コレクション オブジェクトを使用する場合、LightSwitch はサーバー層からエンティティを取得する操作を実行します。LightSwitch がコレクション内のすべてのエンティティを取得するか、そのサブセットのみを取得するかは、使用するオブジェクトの種類によって決まります。コードが期待どおりに実行するためには、記述するビジネス ロジックに対して最も適切な種類のコレクション オブジェクトを選択します。エンティティ コレクション オブジェクトには 2 種類あります。LightSwitch が LINQ 式をリモートで評価するようにするオブジェクト、および LightSwitch が LINQ 式をローカルで評価するようにするオブジェクトです。
LINQ の操作: リモート実行とローカル実行
LINQ 式で EntitySet または IDataServiceQueryable オブジェクトを使用する場合、LightSwitch はサーバー層のデータ サービスに LINQ 式全体を渡します。次に、式の結果が呼び出しコードに戻されます。この種類のクエリ実行は、クエリを満たすエンティティのみが呼び出しコードに返されるため有効です。ただし、クエリ演算子のサブセットのみがデータ サービスによってサポートされています。式で他の LINQ 演算子が必要な場合は、他の種類のコレクション オブジェクトの使用を検討します。
次の例では、IDataServiceQueryable オブジェクトを使用する LINQ 式を示します。この例は、式全体をデータ サービスに渡し、クエリの条件を満たす Order エンティティのみを返す LINQ 操作を示します。
LINQ 式で EntityCollection または IEnumerable オブジェクトを使用する場合、LightSwitch はデータ サービスに式を渡しません。代わりに、LightSwitch は特定の型のすべてのエンティティを取得します。次に、式がローカルのコレクション全体に適用されます。エンティティ コレクションが大きい場合は、この種類のクエリの実行は、パフォーマンスに悪影響を与える場合があります。ただし、コードは、LINQ 演算子の完全なセットを使用できます。加えて、完全なコレクション エンティティをコード内の他のメソッドに渡す場合は、このアプローチが有効な場合があります。
次の例では、EntityCollection オブジェクトを使用する LINQ 式を示します。この例は、特定の顧客のためにすべての Order エンティティを取得する LINQ 操作を示します。次に、クエリの条件がローカルのコレクション全体に適用されます。
例: コード内のエンティティ コレクション オブジェクトの取得
Northwind サンプル データベースの Order エンティティのコレクションを取得する方法を次に示します。
このエンティティ コレクション オブジェクトを取得するには |
次のコードを使用する |
リモートまたはローカルでの実行 |
---|---|---|
EntitySet |
DataWorkspace.Northwind.Orders または myOrder.Details.EntitySet() |
Remote |
IDataServiceQueryable |
myCustomer.OrdersQuery または DataWorkspace.Northwind.Orders.GetQuery() |
Remote |
EntityCollection |
myCustomer.Orders |
ローカル |
IEnumerable |
myCustomer.OrdersQuery.Execute() または DataWorkspace.Northwind.Orders.GetQuery().Execute() |
Remote |