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

问题描述 投票:0回答:1

我有一个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>
sharepoint caml
1个回答
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>
© www.soinside.com 2019 - 2024. All rights reserved.