Я пробовал поиск, но, похоже, я не нашел подходящих ответов. Возможно, потому, что я не совсем уверен, как сформулировать мой вопрос.Передача выражения лямбда LINQ Include() (SharePoint CSOM)
Я пишу библиотеку классов, чтобы помочь работать с объектной моделью на стороне клиента SharePoint. При выполнении запроса можно указать, какие свойства возвращаемых объектов должны быть загружены, чтобы избежать ненужного сетевого трафика. Это делается с помощью выражения Lambda.
Вот пример, который работает:
public ListItemCollection GetItems(
params Expression<Func<ListItemCollection, object>>[] retrievals)
{
var query = new CamlQuery {...};
ListItemCollection queryResults = _list.GetItems(query);
ReloadClientObject(queryResults, retrievals)
return queryResults;
}
public void ReloadClientObject<T>(T clientObject,
params Expression<Func<T, object>>[] retrievals)
where T : ClientObject
{
_context.Load(clientObject, retrievals);
_context.ExecuteQuery();
}
Пример вызова:
var items = GetItems(items => items.Include(
item => item.Id,
item => item.DisplayName));
Это все будет в порядке. Но я предпочел бы вернуть IEnumerable<ListItem>
вместо ListItemCollection
и хотел бы передать параметры типа Expression<Func<ListItem, object>>
вместо Expression<Func<ListItemCollection, object>>
... не вводить пользователя в ListItemCollection
. Итак, я хотел бы переместить вызов Include()
на тело моего метода ... и вот где я застрял.
Вот что у меня до сих пор:
public IEnumerable<ListItem> GetItems(
params Expression<Func<ListItem, object>>[] retrievals)
{
var query = new CamlQuery {...};
ListItemCollection queryResults = _list.GetItems(query);
ReloadClientObject(queryResults, items => items.Include(retrievals))
_context.ExecuteQuery();
return queryResults.AsEnumerable();
}
Пример вызова (намного чище и приятнее):
var items = GetItems(item => item.Id, item => item.DisplayName));
Однако, это бросает OperationNotSupportedException
при вызове метода Load()
.
Я был бы признателен за любые рекомендации. Спасибо!
Какое сообщение об исключении? – i3arnon
Я считаю, что это было пусто ... или вообще не полезно. – nixx
Вам не нужны элементы item items. Выберите (x => new {x.ID, x.DisplayName}) '. Я не внимательно изучил ваш вопрос, но похоже, что вы пытаетесь использовать 'Include' для выполнения проекции, когда' Select' создан для этой цели. – evanmcdonnal