Значение поиска в SharePoint (количество связанных) в запросе Linq

У меня есть два списка, сообщения и комментарии. Комментарии имеют столбец "Уточняющий запрос" к списку "Сообщения", а "Сообщения" имеют отношение "Уточняющий запрос (относительное число)" к списку "Комментарии". То, что я пытаюсь сделать, это просто отображать количество комментариев в каждом сообщении. Почему-то я не могу понять, как это сделать с помощью Entity References.

У меня есть класс ArchiveItem:

    public class ArchiveItem
    {
        public string Id { get; set; }
        public string Title { get; set; }
        public string Comments { get; set; }
        public string Date { get; set; }
    }

И тогда запрос, который я пытаюсь запустить:

        var queryItems = from item in spotlightItems
                         join comment in commentItems on item.Title equals comment.Title
                         select new ArchiveItem
                         {
                             Id = item.Id.ToString(),
                             Title = item.Title,
                             Comments = comment.Post.Title.Count().ToString(),
                             Date = item.Date.ToString()
                         };

Я попробовал несколько разных способов и получил множество сообщений об ошибках. Эта конкретная версия дает мне

В запросе используются неподдерживаемые элементы, такие как ссылки на несколько списков или проекция полной сущности с использованием EntityRef/EntitySet.

Есть идеи? Я думал, что это будет довольно просто, но, может быть, я что-то упустил.

1 ответ

Linq-to-Sharepoint не поддерживает объединения. Список sharepoint не является отдельной таблицей в реальной базе данных, фактическая модель данных sharepoint не имеет значения, но вы должны помнить, что логичная и дешевая операция в обычном SQL не так проста как таковая в CAML, и каждый запрос Linq-to-Sharepoint в конечном итоге преобразуется в CAML.

Во всяком случае, объединения не реализованы. Вы можете использовать Entity столбцов поиска для получения данных, но в фоновом режиме это всегда реализуется как другой запрос, и по моему опыту вы не можете использовать какие-либо агрегатные или другие операции с несколькими записями для этих объектов поиска, включая Count().

Вероятно, есть хороший способ обойти это, потому что считать такую ​​легкую функцию. Я хотел бы попытаться преобразовать свойство, которое вы хотите сосчитать, в массив (или аналогичный) и использовать длину или счет этого.

В общем, решение этих проблем заключается в том, чтобы обрабатывать данные в вашем коде и полагаться на довольно грубые запросы. И, вложив некоторую осторожность в выбор правильных структур данных, вы сможете очень быстро ускорить операции. Несколько раз я испытывал лучшую производительность при обработке кода, чем с решениями запросов linq-to-sharepoint, хотя запросы в первом случае генерировали определенный объем ненужного трафика данных в базу данных.

Еще одна вещь: если вы планируете в конечном итоге генерировать свои списки Sharepoint, используя CAML или код, и вы используете "кликнувшие" типы / списки содержимого только во время разработки, имейте в виду, что в этих случаях есть различия в классах, которые генерирует SPMetal. В частности, поля поиска представлены не как классы сущностей, а как два обычных поля, с идентификатором элемента и одним с заголовком (больше как в SPListItem). Кроме того, наборы обратного поиска-сущности вообще отсутствуют. Я не видел документации об этом, но я испытал это. Следовательно, вам может понадобиться пересмотреть некоторые из ваших запросов, если вы планируете использовать сайт, созданный на CAML. Может быть обходной путь, но по моему опыту Lookup Entity(наборы) в любом случае очень медленный, и лучше использовать обычный запрос linq.

Надеюсь, это поможет.

Другие вопросы по тегам