Share via


結合と予測のリストを作成する

最終更新日: 2010年8月2日

適用対象: SharePoint Foundation 2010

この記事の内容
リスト ビューでの結合と予測
クエリでの結合と予測
Joins 要素がない暗黙的結合

このトピックでは、Collaborative Application Markup Language (CAML) 定義のビューおよびクエリでのリスト結合およびフィールド予測の使用について説明します。

リスト ビューでの結合と予測

リスト ビューには、プライマリ リストに結合された別のリストのフィールドを含めることができます。CAML View 要素は、その子要素である Joins および ProjectedFields によってこの機能を実装します。これらの子要素は、SPView オブジェクトの Joins プロパティおよび ProjectedFields プロパティによって、オブジェクト モデル内で表されます (SPQuery にも同じ名前のプロパティがあります。詳細については、「クエリでの結合と予測」を参照してください)。

ビューでのリスト結合

Joins 要素には、1 つ以上の Join 要素が含まれています。各要素によって、2 つのリスト間に内部結合または左外部結合が作成されます。これらの結合のどちらかが少なくとも、ビューの親リスト (プライマリ リスト) およびその他のリスト (外部リスト) から継承されていなければなりません。ただし、その外部リストから他の外部リストへの追加結合が存在する可能性もあります。1 つの結合チェーンに存在できるリンクの数に制限はありませんが、Join 要素の合計数は、チェーンであるかどうかにかかわらず、プライマリ リストが含まれる SPWebApplication オブジェクトの MaxQueryLookupFields プロパティの値を超えることはできません。システムの既定値は 8 です。リストは自身に直接結合できます。また、結合チェーンとして結合することもできます。

重要重要

リスト結合を作成するときに注意しなければならない要件があります。種類にかかわらず、リストを 2 つだけ結合することはできません。2 つのリストを結合できる場合、プライマリおよび外部フィールドは、"join on" フィールド ペアとして、いつものように使用することはできません。プライマリ リストのフィールドは Lookup 型フィールドである必要があり、外部リストのフィールドを検索する必要があります。この理由から、すべての結合によって、リスト間の既存の検索関係がミラー化されます。

次のサンプル マークアップでは、子供の古着を売買する父母コミュニティをホストする SharePoint Foundation Web サイトを構想しています。購買メンバー (顧客) の県と市、および販売メンバー (荷主) の市を表示する Orders リストのビューが必要です。これを実装するために、2 つの左外部結合チェーンがあります。

  • Orders - Members - Cities - States

  • Orders - Members - Cities

Joins マークアップでは、次の点について注意してください。

  • Join 要素の Type 属性には "LEFT" または "INNER" のどちらかを使用できます。

  • Orders - Members の結合が 2 つあるので、これを区別する必要があります。これは、ListAlias 属性によって容易に行うことができます。この属性は、最初の結合で Members リストに別名 "customer" を割り当て、2 番目の結合ではそのリストに別名 "shipper" を割り当てます。

  • Members - Cities の結合も 2 つあります。この結合では、同様の方法であいまいさが排除されます。

  • 任意のリスト別名がリストに明示的にマップされる場所がありません。各結合によって既存の検索フィールド関係が並行処理され、検索フィールドの定義により外部リストが識別されるため、マッピングは必要ありません。

  • "join on" フィールドは、FieldRef 要素のペアによって識別されます。最初の要素はプライマリ リストの Lookup フィールドを表し、内部名によってそのフィールドを識別します。これには、"Id" に設定された RefType 属性が必要です。結合のプライマリ リストがビューの親リストでない場合、これは別名が設定された List 属性でも識別されます。各ペアの 2 番目の FieldRef 要素は、外部リストと外部キー フィールドを識別します。外部リストの識別には別名が使用されます。また、外部キー フィールドは必ず Id フィールドでなければなりません。

<Joins>
  <Join Type='LEFT' ListAlias='customer'>
    <Eq>
      <FieldRef Name='CustomerName' RefType='Id'/>
      <FieldRef List='customer' Name='ID'/>
    </Eq>
  </Join>

  <Join Type='LEFT' ListAlias='customer_city'>
    <Eq>
      <FieldRef List='customer' Name='CityName' RefType='Id'/>
      <FieldRef List='customer_city' Name='Id'/>
    </Eq>
  </Join>

  <Join Type='LEFT' ListAlias='customer_city_state'>
    <Eq>
      <FieldRef List='customer_city' Name='StateName' RefType='Id'/>
      <FieldRef List='customer_city_state' Name='Id'/>
    </Eq>
  </Join>

  <Join Type='LEFT' ListAlias='shipper'>
    <Eq>
      <FieldRef Name='ShipperName' RefType='Id'/>
      <FieldRef List='shipper' Name='ID'/>
    </Eq>
  </Join>

  <Join Type='LEFT' ListAlias='shipper_city'>
    <Eq>
      <FieldRef List='shipper' Name='CityName' RefType='Id'/>
      <FieldRef List='shipper_city' Name='Id'/>
    </Eq>
  </Join>
</Joins>

ビューの予測フィールド

ProjectedFields 要素は外部リストからフィールドを作成し、そのフィールドをリスト ビューで使用できるようにします。フィールドは、View 要素の ViewFields 子要素で識別する必要もあります。

引き続き父母コミュニティを例に挙げ説明します。次の ProjectedFields では、顧客の市、顧客の県、および荷主の市のフィールドが作成されます。このマークアップでは、次の点に注意してください。

  • 外部リストは、Joins 要素で定義されているように、別名によって識別されます。

  • ShowField 属性は、外部リストのどのフィールドがビューで使用されるかを識別します。

  • Type 属性には必ず "Lookup" 値があります。この理由により、Type 属性はフィールドのデータ型を示しません。この属性は、通常、Field 要素でフィールドのデータ型を示すためです。Field 要素が ProjectedFields の子要素の場合、Type は、単に Join (ProjectedFields 要素が依存する Joins 要素内にあります) が、リスト間の既存の検索関係に基づいているかどうかを示します。すべての結合が既存の検索関係に基づいている必要があります。予測フィールドとして使用できる CAML フィールド型のリストについては、以下を参照してください。

<ProjectedFields>
  <Field 
    Name='CustomerCity'
    Type='Lookup'
    List='customer_city'
    ShowField='Title'/>
  <Field 
    Name='CustomerCityState'
    Type='Lookup'
    List='customer_city_state'
    ShowField='Title'/>
  <Field 
    Name='ShipperCity'
    Type='Lookup'
    List='shipper_city'
    ShowField='Title'/>
</ProjectedFields>

次のフィールド型だけを ProjectedFields 要素に含めることができます。

  • Calculated (プレーン テキストとして処理)

  • ContentTypeId

  • Counter

  • Currency

  • DateTime

  • Guid

  • Integer

  • Note (1 行のみ)

  • Number

  • Text

上記で説明したように、ProjectedFields 要素で作成されたフィールドは ViewFields 要素でも指定する必要があります。次のマークアップの例を引き続き参照してください。

<ViewFields>
  <FieldRef Name='CustomerCity'/>
  <FieldRef Name='CustomerCityState'/>
  <FieldRef Name='ShipperCity'/>
</ViewFields>

クエリでの結合と予測

結合および予測フィールドは、CAML クエリでも使用できます。この場合も、結合および予測フィールドは Joins 要素および ProjectedFields 要素で定義されますが、これらの要素は、Query 要素の子ではありません。これは、クエリを表す SPQuery オブジェクトの SPQuery.Joins プロパティおよび SPQuery.ProjectedFields プロパティの値を形成する独立した XML マークアップです。

通常は、LINQ to SharePoint プロバイダーを使用して、サーバー コードで SharePoint Foundation リストに対してクエリを実行することをお勧めします。CAML には Joins 要素および ProjectedFields 要素があるため、LINQ クエリを CAML クエリに変換する LINQ to SharePoint プロバイダーでは、LINQ join (Visual Basic の場合は Join) 演算子および select (Visual Basic の場合は Select) 演算子が完全にサポートされています。コードがクライアントで実行されるよう意図されている場合は、ADO.NET Data Services を使用して SharePoint Foundation のクエリを実行する を使用してクエリを実行することをお勧めします。

CAML クエリを直接作成し、SPQuery オブジェクトの関連するプロパティを明示的に設定する必要がある場合は、クエリを生成するツールを使用することを検討してください。こうしたツールを見つけるには、www.bing.com に移動して、"CAML クエリ ツール" を検索します (引用符は除外します)。Microsoft SharePoint Foundation 2010 がリリースされてから、Joins 要素および ProjectedFields 要素の生成をサポートするツールを入手できるようになるまで、少し時間がかかることがあります。

次の例は、顧客の市がロンドンである Orders リストからすべての注文を返すクエリを示しています。この例では、Orders リストに CustomerName フィールドがあり、このフィールドが Customers リストを検索すること、また後者のリストには CityName フィールドがあり、このフィールドは Cities リストを検索することを想定しています。

クエリには Orders - Customers、および Customers - Cities の結合が必要です。したがって、Joins プロパティの値は次のようになります。

<Joins>
  <Join Type=’LEFT’ ListAlias=’customers’>
    <Eq>
      <FieldRef Name=’CustomerName’ RefType=’Id’ />
      <FieldRef List=’customers’ Name=’ID’ />
    </Eq>
  </Join>

  <Join Type=’LEFT’ ListAlias=’customerCities’>
    <Eq>
      <FieldRef List=’customers’ Name=’CityName’ RefType=’Id’ />
      <FieldRef List=’customerCities’ Name=’ID’ />
    </Eq>
  </Join>
</Joins>

クエリの Where セクションによって顧客の市がテストされるため、CustomerCity フィールドを作成する必要があります。したがって、ProjectedFields の値は次のようになります。

<ProjectedFields>
  <Field
    Name=’CustomerCity’
    Type=’Lookup’
    List=’customerCities’
    ShowField=’Title’ />
</ProjectedFields>

次に、フィールドへの参照を ViewFields 要素に追加して、そのフィールドを使用できるようにする必要があります。このため、ViewFields プロパティの値は次のようになります。

<ViewFields>
  <FieldRef Name='CustomerCity'/>
</ViewFields>

最後に、Query プロパティを次にように設定します。

<Query>
  <Where>
    <Eq>
      <FieldRef Name='CustomerCity'/>
      <Value Type='Text'>London</Value>
    </Eq>
  </Where>
</Query>

Joins 要素がない暗黙的結合

マークアップの読みやすさを最大限に高めるために CAML クエリにリスト結合が含まれているときは、明示的な Joins 要素を使用することをお勧めします。これにより、クエリ マークアップが SharePoint Foundation の将来のバージョンに対応できる可能性も最大限に高まります。ただし、Joins 要素を使用せずに、2 つのリストを暗黙的に結合することもできます。それには、上記の説明に従って、ProjectedFields 要素を作成します。ただし、Field 子要素に、List 属性ではなく FieldRef 属性を設定します。FieldRef は、ソース リストの Lookup 列を識別するにすぎません。また、ProjectedFields 要素に List 属性ではなく FieldRef 属性が設定されている場合は、Name 属性に、ソース リストの列とは異なる任意の値を指定する必要があります (この場合も、このマークアップでは、ターゲット リストを識別する必要はありません。これは、検索関係の構成で指定されるためです)。

たとえば、前のセクションと同じリストと検索関係が指定されている場合、クエリと ViewFields 要素は次のようになります。

<Query>
  <Where>
    <Eq>
      <FieldRef Name='CustomerName'/>
      <Value Type='Text'>Hicks, Cassie</Value>
    </Eq>
  </Where>
</Query>

<ViewFields>
  <FieldRef Name='CustomerName'/>
</ViewFields>

Where 要素によって、Orders リストと Customers リストの暗黙的結合が作成されていることに注意してください。このクエリは、次の ProjectedFields 要素だけでサポートできます。Joins 要素は必要ありません (Name 属性には、FieldRef 属性で指定された実際の検索列名とは異なる任意の名前が付けられていることに注意してください)。

<ProjectedFields>
  <Field
    Name=’OrderingCustomer’
    Type=’Lookup’
    FieldRef=’CustomerName’
    ShowField=’Title’ />
</ProjectedFields>

この方法を使用しても、ソース列とターゲット リスト間の検索関係は必要です。また、この方法では、結合チェーンを作成できません。たとえば、前のセクションの末尾にある Query 要素はサポートできません。このクエリでは、Orders - Customers - Cities の暗黙的な二重の結合が作成されます。結合チェーンには明示的な Joins 要素が必要です。

関連項目

その他の技術情報

LINQ to SharePoint でデータを管理する