如何过滤ListItemCollection sharepoint对象模型

时间:2018-05-02 05:44:08

标签: c# sharepoint sharepoint-object-model

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使用filename.if文件名与数据库表文件名匹配获取我要过滤列表的所有4个文件,然后从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 :(得分:1)

尝试将您的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 字段<{1}} { {1}}

但是你应该检查哪个属性包含你所追求的文件名。在 我的情况我需要将3.txt更改为4.txt

因此,对于动态文件名列表,您可以在执行查询之前为每个文件名附加一个新行。也许像是

FileLeafRef

答案 1 :(得分:1)

我们也可以使用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();

要动态构建lambda表达式,请查看以下文章:

Build Lambda Expressions Dynamically