計画手順 4: 各エンティティに必要なフィルターを識別する
最終更新日: 2010年4月19日
適用対象: SharePoint Server 2010
各外部コンテンツ タイプに必要なフィルターを決定するには、各 Web メソッドの各入力パラメーターを調べて、実行時に Business Data Connectivity (BDC) service がそのパラメーターの値をどのように取得すればよいかを判断します (たとえば、ビジネス データ Web パーツで、など)。実行時にユーザーに値を指定させる場合は、いずれかのユーザー フィルターを使用します。また、BDC で自動的に値を提供する場合は、いずれかのシステム フィルターを使用するか、またはメタデータ自体で既定値を提供します。
たとえば、SampleWebService プロキシでの GetCustomers メソッドについて考えます。このメソッドは、2 つの入力パラメータ name と limit を受け取ります。ビジネス データ リスト Web パーツのユーザーが、"Name like 'Jo%'" や "Name contains 'John'" のような値を指定して GetCustomers メソッドの結果をフィルタする場合は、FilterDescriptor と name 入力パラメータを関連付けます。
宣言するフィルターを、バックエンド Web サービスのメソッドがサポートしている必要があります。サポートしていないと、Web メソッドは意図した結果を返さない可能性があります。最初に、Web メソッドのドキュメントを調べてメソッドがサポートするフィルター機能を確認します。次に、メタデータで FilterDescriptors を宣言します。
たとえば、プロキシの GetCustomers Web メソッドを調べると、次のコードのように、このメソッドが 2 つの入力パラメーター name と limit を受け取ることがわかります。
public Customer[] GetCustomers(string name, [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] System.Nullable<int> limit) {
object[] results = this.Invoke("GetCustomers", new object[] {
name,
limit});
return ((Customer[])(results[0]));
}
この Web メソッドのドキュメントで、メソッドの使用方法が次のコードのように記述されているものとします。
GetCustomers(name, limit) where
name: A string representing the customer's name. This parameter accepts wildcards (that is, '%' representing any string of characters).
limit: A number that limits the number of customers returned in the result set.
この説明には、入力パラメーター name および limit を、それぞれワイルドカードおよび limit フィルターと関連付けることができると明確に記されています。
各フィルターには、たとえばビジネス データ Web パーツなどでユーザーに対して表示される名前を指定します。FilterDescriptor の UsedForDisambiguation プロパティを使用して、外部データ ピッカー コントロールおよびビジネス データ Web パーツに、フィルターに一致する候補の一覧を生成するように指示できます。FilterDescriptor の定義では、Type 属性の値が非常に重要です。この値は、BDC にフィルターの種類を伝えます。ユーザー フィルターまたはシステム フィルターのどちらかを使用できます。次に示すのは、GetCustomers メソッドのメタデータ XML です。
<Method Name="GetCustomers">
<FilterDescriptors>
<FilterDescriptor Type="Wildcard" Name="Name" />
<!-- Limit filter tells Business Data Catalog to bring back
only the specified number of rows back from the line-of-business
application.-->
<!-- Notice that the back-end method should support this
functionality to return only the specified number of rows.
For a sample, see SampleWebService.-->
<FilterDescriptor Type="Limit" Name="Limit" />
</FilterDescriptors>
<Parameters>
<Parameter Direction="In" Name="name">
<TypeDescriptor TypeName="System.String" AssociatedFilter="Name" Name="name" />
</Parameter>
<Parameter Direction="In" Name="limit">
<TypeDescriptor TypeName="System.Int32" AssociatedFilter="Limit" Name="limit" />
</Parameter>
<Parameter Direction="Return" Name="Customers">
<TypeDescriptor TypeName="SampleWebServiceProxy.Customer[], SampleWebService" IsCollection="true" Name="ArrayOfCustomer">
<TypeDescriptors>
<TypeDescriptor TypeName="SampleWebServiceProxy.Customer, SampleWebService" Name="Customer">
<TypeDescriptors>
<TypeDescriptor TypeName="System.String" IdentifierName="CustomerID" Name="CustomerID" />
<TypeDescriptor TypeName="System.String" Name="Name" />
<TypeDescriptor TypeName="System.Int64" Name="WorkPhoneNumber" />
<TypeDescriptor TypeName="System.Int64" Name="MobilePhoneNumber" />
<TypeDescriptor TypeName="System.String" Name="Industry" />
<TypeDescriptor TypeName="System.String" Name="WebSite" />
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Type="Finder" ReturnParameterName="Customers" ReturnTypeDescriptorName="ArrayOfCustomer" ReturnTypeDescriptorLevel="0" Name="FindCustomerInstances" />
</MethodInstances>
</Method>
BDC でサポートされるフィルターの一覧については、「Business Data Connectivity Service によってサポートされるフィルターの種類」を参照してください。