Использование linq для фильтрации списков sharepoint с помощью подсписков - PullRequest
0 голосов
/ 02 июля 2018

У меня есть проблема, которую я не могу исправить с помощью моего довольно небольшого знания LINQ.

У меня есть коллекция списков, которые содержат список полей. Мне нужны только списки со свойствами hidden == false и получившие поля с описанием «Special Field».

Я пробовал следующие подходы ... ни один из них не работал:

clientContext.Load(listCollection,
lists => lists
.Where(list => list.Hidden == false)
.SelectMany(list => list.Fields)
.Where(field => field.Description == "Special Field"));

и

var listQuery = from list in listCollection.Where(l => l.Hidden == false)
from field in list.Fields
where field.Description == "Special Field"
select list;

и

var listQuery2 = listCollection
.SelectMany(lists => listCollection)
.Where(l => l.Hidden == false)
.SelectMany(fields => fields.Fields)
.Where(f => f.Description == "Special Field"

все следуют

var result = clientContext.LoadQuery(listQuery2);
clientContext.ExecuteQuery();

Никто из них не работал.

Я получаю следующее исключение (для последнего запроса, но сообщение аналогично другим запросам):

Значение выражения запроса '(Microsoft.SharePoint.Client.ListCollection) .SelectMany (lists => value (docma.Library.Classes.SharepointDataConnector + <> c__DisplayClass56_0) .listCollection) .Where (l => (l.Hidden = = False)). SelectMany (fields => fields.Fields) 'не поддерживается.

Кто-нибудь знает, что я делаю неправильно или как заставить его работать?

Нужно ли использовать 2 запроса?

Производительность важна.

Заранее спасибо.

1 Ответ

0 голосов
/ 03 июля 2018

Как говорится в сообщении об ошибке Enumerable.SelectMany не поддерживается Поставщик LINQ to SharePoint

Для получения следующих данных

Мне нужны только списки со скрытыми свойствами == false и которые получили поля с описанием «Специальное поле».

Вы можете использовать следующий запрос с помощью ClientContext.LoadQuery метода :

var lists = ctx.Web.Lists;
var result = ctx.LoadQuery(lists.Where(list => list.Hidden == false).Include(l => l.Fields.Where(f => f.Description == "Special Field")));
ctx.ExecuteQuery();

или

var lists = ctx.Web.Lists;
var result = ctx.LoadQuery(lists.Where(list => list.Hidden == false).Include(l => l.Title,l => l.Fields.Where(f => f.Description == "Special Field").Include( f => f.Title, f => f.Description)));
ctx.ExecuteQuery();

где вы можете указать какие свойства должны быть возвращены как List.Title, Field.Title и Field.Description в этом случае

Обновление

Чтобы вернуть только списки, которые содержат специфическое поле, можно применить следующий фильтр:

var foundLists = result.Where(l => l.Fields.Count > 0).ToList();
...