Как отфильтровать объектную модель Sharepoint ListItemCollection - PullRequest
0 голосов
/ 02 мая 2018
CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = @"<View Scope='RecursiveAll'>
                            <Query>
                            </Query>
                        </View>";
camlQuery.FolderServerRelativeUrl = folder.ServerRelativeUrl;
ListItemCollection listItems = list.GetItems(camlQuery);
clientContext.Load(listItems);
clientContext.ExecuteQuery(); 

listItems получает все 4 файла, которые я хочу отфильтровать в списке, используя filename.if имя файла совпадает с именем файла таблицы базы данных, а затем исключает этот элемент из listItems

например -

4 files - 1.txt 2.txt 3.txt 4.txt
in `database` table if `1.txt and 2.txt` is present then it will match with listItems filename and need to exclude these two items from listItems.

выше - это просто пример, у меня есть 100-ый файл, который мне нужно сравнить по имени файла и исключить из списка, если он присутствует в таблице базы данных.

So we listItems is having only 2 items - 3.txt 4.txt

Как мне этого добиться без цикла foreach? Есть ли что-нибудь, что я могу использовать, как LINQ или CamlQuery?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Мы также можем использовать LINQ для фильтрации результатов.

CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = @"<View Scope='RecursiveAll'>
                      <Query>
                      </Query>
                  </View>";
camlQuery.FolderServerRelativeUrl = folder.ServerRelativeUrl;
ListItemCollection listItems = list.GetItems(camlQuery);
clientContext.Load(listItems);
clientContext.ExecuteQuery();

var items = listItems.Where(i => i.FieldValues["FileLeafRef"].ToString().Equals("1.txt")||i.FieldValues["FileLeafRef"].ToString().Equals("2.txt")).ToList();

Чтобы динамически создавать лямбда-выражения, проверьте статью ниже:

Динамическое построение лямбда-выражений

0 голосов
/ 02 мая 2018

Попробуйте изменить свой запрос caml на что-то вроде этого

@"<View Scope='RecursiveAll'>
    <Query>
    <Where>
        <Or>
            <Eq><FieldRef Name='FileLeafRef'/><Value>3.txt</Value></Eq>
            <Eq><FieldRef Name='FileLeafRef'/><Value>4.txt</Value></Eq>
        </Or>
    </Where>                            
    </Query>
</View>";

Таким образом, вы можете запросить элементы , где поле FileLeafRef Eq uals 3.txt или 4.txt

Но вы должны проверить, какое свойство содержит имя файла, который вы ищете. В В моем случае мне нужно было изменить FileLeafRef на Title

Таким образом, для динамического списка имен файлов вы можете добавить новую строку для каждого имени файла перед выполнением запроса. Может быть, что-то вроде

// Declare the query string
var queryString = "<View Scope='RecursiveAll'><Query><Where><or>";

// For each filename, append a new <eq> element containing the relevant details
foreach (var filename in fileNames) { 
    // Process string here, eg check if its in the db or whatever you need to do
    queryString += $"<Eq><FieldRef Name='FileLeafRef'/><Value>{filename}</Value></Eq>";
}

// Append the closing tags of the rest of the query
var queryString += "</or><Where></Query></View>";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...