Функция Sharepoint GetListItems возвращает несовпадающие элементы - PullRequest
0 голосов
/ 14 августа 2010

У меня есть следующий код, который является модифицированной версией с веб-сайта MSDN, для проверки получения всех элементов списка, где поле «UserID» соответствует указанному значению:

Dim xmlDoc = New System.Xml.XmlDocument()

        Dim ndQuery As XmlNode = xmlDoc.CreateNode(XmlNodeType.Element, "Query", "")
        Dim ndViewFields As XmlNode = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "")

        ndQuery.InnerXml = <Query>
                               <Where>
                                   <Eq>
                                       <FieldRef Name="UserID"/>
                                       <Value Type="Text">Foo.Bar</Value>
                                   </Eq>
                               </Where>
                           </Query>


        ndViewFields.InnerXml = <ViewFields>
                                    <FieldRef Name="Title"/>
                                    <FieldRef Name="FirstName"/>
                                    <FieldRef Name="Company"/>
                                    <FieldRef Name="WorkPhone"/>
                                    <FieldRef Name="HomePhone"/>
                                    <FieldRef Name="Email"/>
                                    <FieldRef Name="UserID"/>
                                </ViewFields>

У меня есть один элемент в списке с необязательным UserID = "John.Doe", и я вызываю GetListItems следующим образом:

    ''Gets any user from the Sharepoint New Hires list that matches the UserID variable and print to console
            Dim ndListItems As XmlNode =
            sharepointList.GetListItems("New Hires", Nothing, ndQuery, ndViewFields, Nothing, Nothing, Nothing)

Console.WriteLine(ndListItems.OuterXml)

Я ожидаю, что не получу никаких результатов обратно, так как значения в UserID не совпадают, но, как оказалось, я возвращаю элемент списка, а это не то, чего я хочу. Я не уверен, что происходит. Правильно ли структурирован запрос? Есть ли какой-то параметр, о котором я не знаю, который должен быть включен в функцию GetListItems ?? Вот результаты, которые я получаю после запуска функции.

<listitems xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<rs:data ItemCount="1">
   <z:row ows_ContentTypeId="0x01060051A3C5B94E00A446B900C3759422E391" ows_Title="Doe" ows_FirstName="John" ows_Email="john.doe@email.com" ows_Company="MyCompany" ows_WorkPhone="987-123-4567" ows_HomePhone="987-123-4567" ows_UserID="John.Doe" ows_ID="6" ows_ContentType="Contact" ows_Modified="2010-08-13 12:58:14" ows_Created="2010-08-13 12:58:14" ows_Author="23;#John Doe" ows_Editor="23;#John Doe" ows_owshiddenversion="1" ows_WorkflowVersion="1" ows__UIVersion="512" ows__UIVersionString="1.0" ows_Attachments="0" ows__ModerationStatus="0" ows_LinkTitleNoMenu="Doe" ows_LinkTitle="Doe" ows_SelectTitle="6" ows_Order="600.000000000000" ows_GUID="{750F74FC-1CA3-40A2-8237-CD04E0390722}" ows_FileRef="6;#Lists/NewHires/6_.000" ows_FileDirRef="6;#Lists/NewHires" ows_Last_x0020_Modified="6;#2010-08-13 12:58:14" ows_Created_x0020_Date="6;#2010-08-13 12:58:14" ows_FSObjType="6;#0" ows_PermMask="0x7fffffffffffffff" ows_FileLeafRef="6;#6_.000" ows_UniqueId="6;#{778A7804-ABAA-49DC-9061-DE050DE5F032}" ows_ProgId="6;#" ows_ScopeId="6;#{C084EB37-9260-47CD-A231-AC23477D4856}" ows__EditMenuTableStart="6_.000" ows__EditMenuTableEnd="6" ows_LinkFilenameNoMenu="6_.000" ows_LinkFilename="6_.000" ows_ServerUrl="/Lists/NewHires/6_.000" ows_EncodedAbsUrl="http://sbatsharepoint2/Lists/NewHires/6_.000" ows_BaseName="6_" ows_MetaInfo="6;#" ows__Level="1" ows__IsCurrentVersion="1" />
</rs:data>
</listitems>

UPDATE:

Все еще не повезло, у меня были двойные кавычки вокруг типов полей в запросе, которые я заменил одиночными кавычками, но это ничего не сделало. Я также попытался заменить имя списка на его GUID, опять же ничего. Я трижды проверил все вызовы функций, параметры и переменные. Все еще не уверен, в чем проблема.

UPDATE2:

Попробовал проверить запрос с другим полем следующим образом:

ndQuery.InnerXml = <Query>
                               <Where>
                                   <Eq>
                                       <FieldRef Name="Title"/>
                                       <Value Type="Text">Mike</Value>
                                   </Eq>
                               </Where>
                           </Query>

Конечно, в списке нет элемента с заголовком = Mike, но функция все равно возвращает все элементы.

Ответы [ 3 ]

1 голос
/ 16 июля 2014

для всех, кто интересуется этим вопросом, я столкнулся с аналогичной проблемой, когда части моего запроса были проигнорированы, поскольку он не работает с экранированными кавычками.Самый простой способ исправить это - поставить строку запроса перед символом @.

, поэтому

query.InnerXml = "<Where><Eq><FieldRef Name=\"FSObjType\" />
                                <Value Type=\"Int\">0</Value></Eq>
                                </Where>";

становится

query.InnerXml = @"<Where><Eq><FieldRef Name='FSObjType' />
                                <Value Type='Int'>0</Value></Eq>
                                </Where>";

. Это еще один способ добиться того жекак указано выше.

0 голосов
/ 17 августа 2010

Наконец, после просмотра этой статьи MSDN оказалось, что я должен передать запрос и поля просмотра как строковые литералы, я заметил это в примерах на MSDN, но не думал, что формат сделалРазница, также мне пришлось удалить самый внешний тег "<\ Query>".Приведенный ниже формат работает для меня:

''Search for items in the list with the UserID="Foo.Bar"
        ndQuery.InnerXml = "<Where><Eq><FieldRef Name=""UserID"" />" + "<Value Type=""Text"">Foo.Bar</Value></Eq></Where>"

        ndViewFields.InnerXml = "<FieldRef Name=""Title"" />" + "<FieldRef Name=""FirstName"" />"

Мне кажется странным то, что я не могу передать весь запрос как строковый литерал, но должен разбить его после "<\ fieldRef>"тег, я не уверен, почему это так в CAML.Любое просвещение по этому вопросу ценится;на данный момент, насколько я могу судить, это может быть волшебством.

0 голосов
/ 16 августа 2010

Вы можете попробовать это и посмотреть, поможет ли это:

    ndQuery.InnerXml = <Query>
                           <Where>
                               <Eq>
                                   <FieldRef Name="ows_UserID"/>
                                   <Value Type="Text">Foo.Bar</Value>
                               </Eq>
                           </Where>
                       </Query>
...