查询SharePoint列表以获取多个输入时发生CAML错误

时间:2019-12-13 01:50:45

标签: sharepoint caml

我有一个CAML查询,它从SharePoint列表中检索数据。输入1次即可通过,但如果输入2个以上则失败。

错误:

  

Microsoft.SharePoint.SPException:一种或多种字段类型不是   正确安装。转到列表设置页面以删除这些   领域。 ---> System.Runtime.InteropServices.COMException:一个或多个   字段类型未正确安装。转到列表设置页面   删除这些字段。

     

研究后,可能的原因可能是由于SharePoint列InternalName不匹配。但是,查询设法对1个输入执行,但不对2个或更多输入执行。

根据下面的查询示例,在FAIL情况下我的格式是否错误?


1。通过:

<Where>
    <And>
        <Eq>
            <FieldRef Name="Header1Ref"/><Value Type="Text">H1</Value>
        </Eq>
        <Neq>
            <FieldRef Name ="ContentType"/><Value Type="Text">Document</Value>
        </Neq>
    </And>
</Where>

2。失败:

<Where>
    <And>
        <Eq>
            <And>
                <Or>
                    <Eq>
                        <FieldRef Name="Header1Ref"/><Value Type="Text">H1</Value>
                    </Eq>
                    <Eq>
                        <FieldRef Name="Header1Ref"/><Value Type="Text">H2</Value>
                    </Eq>
                </Or>
                    <Neq>
                        <FieldRef Name ="ContentType"/><Value Type="Text">Document</Value>
                    </Neq>
            </And>
        </Eq>
    </And>
</Where>

3。失败:

<Where>
    <And>
        <Eq>
            <And>
                <Or>
                    <FieldRef Name="Header1Ref"/><Value Type="Text">H1</Value>
                    <FieldRef Name="Header1Ref"/><Value Type="Text">H2</Value>
                </Or>
                <Neq>
                    <FieldRef Name ="ContentType"/><Value Type="Text">Document</Value>
                </Neq>
            </And>
        </Eq>
        <Neq>
            <FieldRef Name ="ContentType"/><Value Type="Text">Document</Value>
        </Neq>
    </And>
</Where>

1 个答案:

答案 0 :(得分:0)

这是CAML查询的问题,我将代码修改如下,以供您参考。

string siteUrl = "http://sp2013";
string listTitle = "DL";
string viewName="Test";

using (SPSite site = new SPSite(siteUrl))
{
    using (SPWeb web = site.OpenWeb())
    {
        SPList list = web.Lists[listTitle];
        SPView view=list.Views[viewName];
        string orQuery = "<Or><Eq><FieldRef Name=\"Header1Ref\"/><Value Type=\"Text\">H1</Value></Eq><Eq><FieldRef Name=\"Header1Ref\"/><Value Type=\"Text\">H2</Value></Eq></Or>";
        string subQuery = String.Format("<Neq><FieldRef Name =\"ContentType\"/><Value Type=\"Text\">{0}</Value></Neq>", "Document");
        string queryText = String.Format("<Where><And>{0}{1}</And></Where>", orQuery, subQuery);
        var query = new SPQuery(view)
        {
            Query = queryText,
            ViewAttributes = "Scope=\"RecursiveAll\"",
            ViewFields = @"<FieldRef Name='RecordTitle'/>",
        };

        SPListItemCollection items = list.GetItems(query);
        foreach (SPListItem item in items)
        {
            Console.WriteLine(item["RecordTitle"]);
        }
        Console.ReadKey();
    }
}

如下所示的CAML查询。

<Where>
    <And>
        <Or>
            <Eq><FieldRef Name="Header1Ref"/><Value Type="Text">H1</Value></Eq>
            <Eq><FieldRef Name="Header1Ref"/><Value Type="Text">H2</Value></Eq>
        </Or>
        <Neq>
            <FieldRef Name="ContentType"/><Value Type="Text">Document</Value>
        </Neq>
    </And>
</Where>