Pergunta

Estou desenvolvendo remoto do receptor de evento para um SharePoint Online inquilino e notei que com cada implantação de um novo Receptor de Evento é adicionado para a web.Assim, no aplicativo instalado evento eu quero encontrar todos os receptores de eventos e eliminá-los antes de adicionar um novo.Eu estou a tentar utilizar uma consulta LINQ para obter todos eles e, em seguida, chamar DeleteObject mas não gosto da minha consulta.

Aqui está o código que eu estou usando e o erro.Obrigado pela ajuda.

public class AppEventReceiver : IRemoteEventService
{
    public SPRemoteEventResult ProcessEvent(SPRemoteEventProperties properties)
    {
        SPRemoteEventResult result = new SPRemoteEventResult();

        using (ClientContext clientContext = TokenHelper.CreateAppEventClientContext(properties, false))
        {
            if (clientContext != null)
            {
                clientContext.Load(clientContext.Web, ev=>ev.EventReceivers);
                clientContext.ExecuteQuery();

                // Create new List Added Event Receiver
                EventReceiverDefinitionCreationInformation listAddedEV = new EventReceiverDefinitionCreationInformation()
                {
                    EventType = EventReceiverType.ListAdded,
                    ReceiverName = "List_Events",
                    ReceiverUrl = GetServiceURL("List_Events.svc"),
                    SequenceNumber = 1000
                };

                // Add Event Receiver to Web's EventReceivers.
                EventReceiverDefinitionCollection webEvs = clientContext.Web.EventReceivers;

                List<EventReceiverDefinition> existingEvs = webEvs.Where(n => n.ReceiverName == "List_Events").ToList(); // Error is here!

                foreach (EventReceiverDefinition ev in existingEvs)
                {
                    ev.DeleteObject();
                }

                // Add event receiver to Projects List
                webEvs.Add(listAddedEV);
                clientContext.ExecuteQuery();
            }
        }

        return result;
    }

Mensagem De Erro:Do sistema.NotSupportedException foi tratada pelo código do usuário

StackTrace:no Microsoft.SharePoint.O cliente.ClientQueryable1.GetEnumerator() at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 fonte) em EventReceiverTestWeb.Serviços.AppEventReceiver.ProcessEvent(SPRemoteEventProperties propriedades) no c:\Users imothyo\Documents\Visual Studio 2013\Projetos\EventReceiverTest\EventReceiverTestWeb\Services\AppEventReceiver.svc.cs:linha de 36 em SyncInvokeProcessEvent(Object , Object [] , [Objeto] ) em Sistema.ServiceModel.Dispatcher.SyncMethodInvoker.Invocar(Objeto instância, Object[] entradas, Object [] e saídas) em Sistema.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)

Foi útil?

Solução

Eu enfrentei esse problema hoje no Modelo de Objeto do Cliente, parece que ele não suporta a comparação de seqüências de caracteres com == ou Equals o método.

.Where(n => n.ReceiverName == "List_Events") isto é o que está causando o problema..

Você pode precisar Carregar EventReceiverDefinitionCollection webEvs objeto e de iterar na coleção para combinar com o ReceiverName propriedade

ATUALIZAÇÃO

Você pode tentar definir as credenciais e especificar o usuário explicitamente como:

context.Credentials = new NetworkCredential("user", "password", "domain");

Outras dicas

O problema está sendo causado porque o Sharepoint tipo de coleção não suporta toda a gama de expressões de Linq.

Para contornar este convertê-lo de um Sharepoint coleção para uma lista genérica com outro .ToList() como abaixo.

var existingEvs = webEvs.ToList().Where(n => n.ReceiverName == "List_Events").ToList();

Se isso fosse LinqToSql isso faria com que todas as linhas sejam recuperadas do servidor sem filtragem fazendo com que ele diminua significativamente, no entanto, como você já tiver carregado todas as linhas na memória do cliente com a Carga e ExecuteQuery a diferença deve ser insignificante.

Eu acredito, mas não tenho certeza, que este é apenas um problema com o Sharepoint 2013 e o V15 DLLs, e que o V16 DLLs de suporte a uma ampla gama de expressões de Linq.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top