Se non è possibile inserire l'intera tabella SQL nell'elenco esterno, non è possibile interrogare quel set di dati come si potrebbe fare in un elenco di SharePoint.
Tuttavia, posso offrire una soluzione che abbiamo utilizzato per scenari praticamente identici a questo che ha funzionato molto bene per noi. Nel nostro scenario stiamo interrogando un database Oracle che impiega sempre per restituire insiemi di dati di grandi dimensioni.
L'approccio che abbiamo adottato è stato quello di utilizzare il modello di fabbrica per determinare in base a quale mezzo l'origine dati (elenco SharePoint, database esterno, ecc.) Dovrebbe essere interrogata.
Gli esempi seguenti sono un po 'banali, ma illustrano bene il concetto.
Quindi, iniziare con una interfaccia che definisce come i dati ottenuti non essere interrogato e quali campi sarà restituito:
public interface IQueryData
{
string ListToQuery { get; set; }
List<MyResultObject> ExecuteQuery();
}
avreste un oggetto personalizzato che rappresenta un singolo record restituito dalla query
public class MyResultObject
{
public string FileRef { get; }
public string Title { get; set; }
// any other fields you'd like to see potentially returned...
}
Poi si avrebbe un fornitore di dati che implementa questa interfaccia per l'origine dati 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
}
}
Si piacerebbe anche avere un fornitore di dati che implementa l'interfaccia per un'origine dati di 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
}
}
Con questa implementazione hai incapsulato la logica ed i dettagli della query nei vostri rispettivi fornitori di dati.
Ora che ci si dispone di una fabbrica che costruisce il provider appropriato di dati (in base al parametro ListToQuery specificato):
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
}
}
}
Infine, devi usare la vostra fabbrica per avviare la tua ricerca, passando il nome della sorgente di dati che si desidera eseguire una query:
public List<MyResultObject> RunQuery()
{
return QueryDataProviderFactory.Build("BigSqlTable").ExecuteQuery();
}
Questo modello mantiene l'implementazione esterna incapsulata in un proprio fornitore di dati e astrae i dettagli della query da parte del consumatore. Tutto ciò che il consumatore deve fare è specificare il nome della lista che desidera interrogare e la Fabbrica decide quale implementazione avviare.
Si possono anche fare l'interfaccia IQueryData implementare generici per ulteriori estensibilità:
public interface IQueryData<T>
{
string ListToQuery { get; set; }
List<T> ExecuteQuery();
}
Questo avrebbe aperto la porta per il consumatore di specificare anche il tipo di oggetto che ci si aspetta di essere restituito.
La nostra interfaccia dati di query ha in realtà molti più membri che aggiungono ulteriori punti di estensibilità ai nostri provider di query, ma ho pensato che questo esempio illustrasse il punto in modo conciso e facile da comprendere.
Volevo solo offrire questo suggerimento in quanto sembra quasi lo stesso scenario che abbiamo riscontrato circa un anno fa e questa strategia ha funzionato molto bene per noi.
Avete BCS come connettore SQL o connettore Assembly? –
@MaksMatsveyeu Sono interessato a questa domanda in senso generale, cioè dovrebbe essere agnostico al connettore. –