SQLテーブル全体を外部リストに取り込むことができない場合は、SharePointリストのように、そのデータセットをクエリできるようにする方法はありません。
ただし、これと実質的に同じシナリオで使用したソリューションを提供することはできます。これは、非常にうまく機能しています。このシナリオでは、大きなデータセットを返すのに永遠にかかるOracleデータベースにクエリを実行しています。
私たちが採用したアプローチは、ファクトリパターンを使用して、データソース(SharePointリスト、外部データベースなど)をクエリする必要がある手段を決定することでした。
以下の例は少し陳腐ですが、概念をよく示しています。
したがって、データセットのクエリ方法と返されるフィールドを定義するインターフェイスから始めます。
public interface IQueryData
{
string ListToQuery { get; set; }
List<MyResultObject> ExecuteQuery();
}
クエリによって返される単一のレコードを表すカスタムオブジェクトがあります
public class MyResultObject
{
public string FileRef { get; }
public string Title { get; set; }
// any other fields you'd like to see potentially returned...
}
次に、SQLデータソース用にこのインターフェイスを実装するデータプロバイダーがあります。
public class SqlDataProvider : IQueryData
{
public string ListToQuery { get { return "BigSqlTable"; } }
public List<MyResultObject> ExecuteQuery()
{
// query your external data source here...
// populate a list of MyResultObject's from the result set and return it to the consumer
}
}
SharePointデータソースのインターフェイスを実装するデータプロバイダーもあります
public class SharePointDataProvider : IQueryData
{
public string ListToQuery { get { return "MySharePointList"; } }
public List<MyResultObject> ExecuteQuery()
{
// query your SharePoint list here, using CAML, SharePoint object model, etc...
// populate a list of MyResultObject's from the result set and return it to the consumer
}
}
この実装では、それぞれのデータプロバイダーでクエリのロジックと詳細をカプセル化しました。
これで、(指定されたListToQueryパラメーターに基づいて)適切なデータプロバイダーを構築するファクトリができました。
public static class QueryDataProviderFactory
{
public static IQueryData Build(string listToQuery)
{
switch(listToQuery)
{
case "BigSqlTable": return new SqlDataProvider(); break;
case "MySharePointList": return new SharePointDataProvider(); break;
// you can have many other implementations here that query your data sources in different manners
}
}
}
最後に、ファクトリを使用してクエリを開始し、クエリするデータソースの名前を渡します。
public List<MyResultObject> RunQuery()
{
return QueryDataProviderFactory.Build("BigSqlTable").ExecuteQuery();
}
このパターンは、外部実装を独自のデータプロバイダーにカプセル化したままにし、コンシューマーからクエリの詳細を抽象化します。コンシューマーが行う必要があるのは、照会するリストの名前を指定することだけであり、ファクトリは開始する実装を決定します。
IQueryDataインターフェースにジェネリックを実装させて、さらに拡張することもできます。
public interface IQueryData<T>
{
string ListToQuery { get; set; }
List<T> ExecuteQuery();
}
これにより、消費者は、返されると予想されるオブジェクトのタイプも指定できるようになります。
私たちのクエリデータインターフェイスには、実際にはさらに多くのメンバーがあり、クエリプロバイダーにさらに多くの拡張ポイントを追加していますが、この例は、ポイントを簡潔で把握しやすい方法で示していると思いました。
1年ほど前に遭遇したのとほぼ同じシナリオのようであり、この戦略は私たちにとって非常にうまく機能しているため、この提案を提供したかっただけです。