如果您无法将整个 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();
}
这将为消费者打开大门,让他们也可以指定他们期望返回的对象类型。
我们的查询数据接口实际上有更多的成员,它们为我们的查询提供程序添加了更多的扩展点,但我认为这个示例以简洁易懂的方式说明了这一点。
只是想提出这个建议,因为它看起来与我们大约一年前遇到的情况几乎相同,而且这种策略对我们来说效果很好。