Значение поиска в 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.
Надеюсь, это поможет.