如何过滤 ListItemCollection 共享点对象模型
How to filter ListItemCollection 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 正在获取我要过滤列表的所有 4 个文件,使用 filename.if 文件名与数据库 table 文件名匹配,然后从 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 个文件,我需要使用文件名进行比较,如果存在于数据库中,则从列表中排除 table。
So we listItems is having only 2 items - 3.txt 4.txt
如果没有 foreach 循环,我该如何实现?有什么我可以使用的 LINQ 或 CamlQuery 吗?
尝试将您的 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 字段 Equals [=12] 中查询项目=] 或 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>";
我们也可以使用 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 表达式,请查看以下文章:
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 文件名与数据库 table 文件名匹配,然后从 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 个文件,我需要使用文件名进行比较,如果存在于数据库中,则从列表中排除 table。
So we listItems is having only 2 items - 3.txt 4.txt
如果没有 foreach 循环,我该如何实现?有什么我可以使用的 LINQ 或 CamlQuery 吗?
尝试将您的 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 字段 Equals [=12] 中查询项目=] 或 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>";
我们也可以使用 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 表达式,请查看以下文章: