Если вы не можете вытащить всю таблицу 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();
}
Этот шаблон сохраняет вашу внешнюю реализацию инкапсулированной в своем собственном поставщике данных и абстрагирует детали запроса от потребителя. Все, что нужно сделать потребителю, это указать имя списка, который он хочет запросить, и Factory решит, какую реализацию инициировать.
Вы даже можете сделать так, чтобы ваш интерфейс IQueryData реализовал обобщенные значения для дальнейшей расширяемости:
public interface IQueryData<T>
{
string ListToQuery { get; set; }
List<T> ExecuteQuery();
}
Это даст потребителю возможность указать тип объекта, который он ожидает вернуть.
Наш интерфейс данных запросов на самом деле имеет гораздо больше членов, которые добавляют еще больше точек расширения к нашим поставщикам запросов, но я подумал, что этот пример иллюстрирует эту точку в краткой и простой для понимания форме.
Просто хотел предложить это предложение, так как похоже на тот же сценарий, с которым мы столкнулись год или около того назад, и эта стратегия работает очень хорошо для нас.