Hace unos años, realicé una implementación mediante librería que permitía operar con el cliente de SharePoint de Microsoft, sin necesidad de escribir consultas en formato CamlQuery.
Hace poco, me surgió la misma necesidad y opté por mejorar y convertir aquella librería en un paquete Nuget público. El mismo, permite conectar aplicaciones .NET con SharePoint Server, con una abstracción absoluta. El paquete denominado Bitbang.SharePoint contiene la clase principal SharepointClient, la cual hace de middleware entre el desarrollador y el paquete de Microsoft. A continuación, las claves principales para utilizarlo en nuestros desarrollos.

Una vez se agrega el paquete al proyecto, también se agrega la dependencia Microsoft.SharePoint.Client v.14.0.4762.1000 que permite la conexión con SharePoint clásico.
Mapear una lista de Sharepoint
Para extraer datos de SharePoint se necesita una clase con los campos que se desean gestionar. Dicha clase, tendrá que heredar de la clase SharePointEntity, esta última es la que se encarga de realizar el papeo de campos pero para eso hay que informar un atributo denominado SharePointColumn por cada propiedad a mapear. Ahí se informa el nombre correspondiente al campo de la lista de SharePoint, así como el tipo de dato y el valor por defecto para inicializar.
Ejemplo:
public class Employee: SharePointEntity
{
[SharePointColumn("ID", SharePointColumnType.Integer,0)]
public SharePointItem Id { get; set; }
[SharePointColumn("Nombre", SharePointColumnType.Text, "")]
public SharePointItem Nombre { get; set; }
[SharePointColumn("Apellido_x0020_1", SharePointColumnType.Text, "")]
public SharePointItem Apellido1 { get; set; }
.
.
.
}
Obtener datos de una lista
Para obtener datos existentes en SharePoint, basta con crear una nueva instancia de SharePointClient y luego solicitar los datos de la lista deseada como se puede ver a continuación:
SharePointClient sp = new SharePointClient("serverUrl", "username"," password");
List<Employee> employees = sp.Items<Employee>("Mis Empleados", null);
foreach (Employee item in employees )
{
Console.WriteLine($"Id: {item.Id}");
Console.WriteLine($"Nombre: {item.Nombre}");
Console.WriteLine($"Apellido1: {item.Apellido1}");
}
CRUD (Create, Read, Update, Delete)
SharePointClient permite realizar todas las operaciones CRUD pero de una manera peculiar. Debido a que no siempre se desea actualizar/insertar todos los campos de la lista, cada una de las clases que apunta a una lista tiene que implementar su propio mapeo por cada operación (insertar o actualizar). Por defecto, SharePointClient intentará localizar el método “Update” para actualizaciones o el método “Insert” para nuevos registros pero el desarrollador tiene la libertad de asignarle el nombre deseado y que estos casos tendría que indicarlo pasándolo como parámetro. Ambos métodos tienen que existir en la clase que represente una lista y que se desee insertar o actualizar datos.
Se pueden tener múltiples métodos para insertar, así como para actualizar. Imaginemos que surge la necesidad de actualizar un único campo de una lista, para esto se crea un segundo método donde se mapea dicho campo y se informa en la llamada que realiza dicha operación.
El siguiente fragmento de código contiene un ejemplo de los distintos métodos que se podrían declara para actualizar e insertar datos en la lista de SharePoint:
public class Employee: SharePointEntity
{
.
.
.
public ListItem Update(ListItemCollection itemsComponents, object item)
{
ListItem itemOut = itemsComponents[0];
Employee employee = (employee)item;
itemOut[employee.Nombre.ColumnName] = employee.Nombre.Value;
itemOut[employee.Apellido1.ColumnName] = employee.Apellido1.Value;
itemOut[employee.Apellido2.ColumnName] = employee.Apellido2.Value;
return itemOut;
}
public ListItem UpdateNameField(ListItemCollection itemsComponents, object item)
{
ListItem itemOut = itemsComponents[0];
Employee employee = (Employee)item;
itemOut[employee.Nombre.ColumnName] = employee.Nombre.Value;
return itemOut;
}
public ListItem Insert(Microsoft.SharePoint.Client.List itemListTarget, ListItemCreationInformation itemCreationInfo, object itemSource)
{
ListItem itemOut = itemListTarget.AddItem(itemCreationInfo);
Employee employee = (Employee)itemSource;
itemOut[employee.Nombre.ColumnName] = employee.Nombre.Value;
itemOut[employee.Apellido1.ColumnName] = employee.Apellido1.Value;
return itemOut;
}
public ListItem InsertOnlyName(Microsoft.SharePoint.Client.List itemListTarget, ListItemCreationInformation itemCreationInfo, object itemSource)
{
ListItem itemOut = itemListTarget.AddItem(itemCreationInfo);
Employee employee = (Employee)itemSource;
itemOut[employee.Nombre.ColumnName] = employee.Nombre.Value;
return itemOut;
}
}
Filtrar elementos de una lista
SharePointClient también permite realizar búsquedas de elementos dentro de una lista de SharePoint. El código que aparece a continuación intenta localizar un único elemento que cumpla un criterio del filtro:
Employee empleado = sp.Items<Employee>("Mis Empleados", new List<SharePointFilter> { new SharePointFilter {
ColumnName ="Nombre",
ColumnType = SharePointColumnType.Text,
Operation= CamlOperations.Eq,
Value = "Pedro" } }).FirstOrDefault();
Como se ha podido ver en el fragmento de código anterior, se tiene que indicar el nombre de la columna (campo), el tipo de dato y el valor buscado, así como también la operación (igual, mayor, menor, etc.).
Buscar y modificar un elemento
El siguiente código realiza una modificación del campo “Nombre”, realizando una llamada al método declarado en párrafos anteriores:
SharePointClient sp = new SharePointClient(serverUrl, username, password);
Employee empleado = sp.Items<Employee>("Mis Empleados", new List<SharePointFilter> { new SharePointFilter {
ColumnName ="Nombre",
ColumnType = SharePointColumnType.Text,
Operation= CamlOperations.Eq,
Value = "Pedro" } }).FirstOrDefault();
if (employee != null)
{
employee.Nombre.Value += " (Modificado)";
sp.Update("Mis Empleados", employee, employee.Id.Value, "UpdateNameField");
}
Eliminar un elemento previamente localizado (es necesario conocer el Id), es tan simple como esto:
if (employee != null)
{
sp.Delete("Mis Empleados", employee.Id.Value);
}
Insertar elementos en una lista
Como se ha indicado anteriormente, el nombre del método insertar por defecto es “Insert” y en ese caso no hay que indicarlo en la llamada, en cambio, si se utiliza un nombre distinto es obligatorio informarlo para que pueda ser localizado.
SharePointClient sp = new SharePointClient(serverUrl, username, password);
Employee employee = new Employee();
employee.Nombre.Value = "Juan";
employee.Apellido1.Value = "Fernández";
// Insertar utilizando el método "Insert":
sp.Insert("Mis Empleados", employee);
// Insertar sólo el campo nombre llamando al método InsertOnlyName:
sp.Insert("Mis Empleados", employee, "InsertOnlyName");
Leave a comment