0
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 个文件。如果文件名与数据库表文件名匹配,则从 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 吗?

4

2 回答 2

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字段等于3.txt 4.txt

但是您应该检查哪个属性包含您所追求的文件名。就我而言,我需要更改FileLeafRefTitle

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

// 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>";
于 2018-05-02T05:57:18.933 回答
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 表达式,请查看以下文章:

动态构建 Lambda 表达式

于 2018-05-02T08:36:06.450 回答