Запрос не возвращает ожидаемых результатов (CAML)

Однако я пытаюсь удалить вложение из списка вложений с помощью CAML; когда я делаю запрос, он всегда возвращает оба моих файла. Мне нужно только получить текущий файл, используя переданное значение в качестве параметра.

SP.List list = context.Web.Lists.GetByTitle("TempAttachments");

 // Query
            SP.CamlQuery query = new SP.CamlQuery();
            query.ViewXml =
                 "<Query><Where><Or>"
                + "<BeginsWith>"
                // Job Note Matches
                + "<FieldRef Name=\"FileRef\"/>"
                + "<Value Type=\"Text\"/>" + ID + "_</Value>"
                + "</BeginsWith>"
                // OR Date Modified is older than one day.
                + "<Lt>"
                + "<FieldRef Name=\"Modified\"/>"
                + "<Value Type=\"DateTime\"/><Today OffsetDays=\"-1\" /></Value>"
                + "</Lt>"
                + "</Or>"
                + "</Where></Query>";

Может быть, проблема в теге Beginswith?


person jan86    schedule 18.06.2015    source источник
comment
Были ли изменены до вчерашнего дня оба файла? Если да, то оба должны быть возвращены с учетом этого запроса.   -  person Servy    schedule 18.06.2015
comment
Я даже изменил их, прежде чем снова протестировать метод, и он по-прежнему возвращает оба файла.   -  person jan86    schedule 18.06.2015
comment
Оба имени файла начинаются с текста, который вы ищете?   -  person Servy    schedule 18.06.2015
comment
да. Оба они начинаются с персонажей ta   -  person jan86    schedule 18.06.2015
comment
Тогда оба должны быть возвращены. В чем проблема? Если они оба соответствуют фильтру, почему бы вам не ожидать увидеть оба элемента?   -  person Servy    schedule 18.06.2015
comment
Возможно, я это неправильно сформулировал. Имя файла A - ta101, а имя файлаB - ta102. Я управляю одним файлом по одному, поэтому, когда я закончу с первым файлом, я нахожу его и удаляю из временного списка.   -  person jan86    schedule 18.06.2015


Ответы (1)


  1. Ваш CAML-запрос должен быть заключен в элемент View при установке ViewXml.

  2. Оба тега Value имеют неправильный формат; вы закрываете элемент в открывающем теге, что означает искажение XML.

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

Итак, ваш запрос теперь может выглядеть следующим образом:

CamlQuery query = new CamlQuery();
query.ViewXml = string.Format(
@"<View>
  <Query>
    <Where>
      <Or>
        <BeginsWith>
          <FieldRef Name='FileRef'/>
          <Value Type='Text'>{0}</Value>
        </BeginsWith>
        <Lt>
          <FieldRef Name='Modified'/>
          <Value Type='DateTime'>
            <Today OffsetDays='-1'/>
          </Value>
        </Lt>
      </Or>
    </Where>
  </Query>
</View>
", ID);
person Servy    schedule 18.06.2015
comment
Это возвращает 0 файлов из временного списка - person jan86; 18.06.2015
comment
@DemetriusParham Тогда очевидно ни один из ваших файлов не соответствует критериям. Раньше вы вообще не применяли никаких фильтров, потому что ваш запрос был искажен, теперь вы фактически их используете. - person Servy; 18.06.2015
comment
Чтобы убедиться, что я понимаю. Запрос выглядит следующим образом: Вернуть результат, идентификатор которого равен или начинается со значения параметра идентификатора, которое было изменено не позднее вчерашнего дня? - person jan86; 18.06.2015
comment
@DemetriusParham Нет. Он возвращает все элементы, которые начинаются со значения ID, а также включает все элементы, которые не были изменены сегодня или вчера. Таким образом, единственные элементы, которые не возвращаются запросом, - это те элементы, которые были изменены за последние два дня и не начинаются с указанного значения идентификатора. Тем не менее, стоит отметить, что вы просматриваете только корневую папку. Если вы хотите, чтобы элементы не находились в корневой папке, вам нужно указать правильную папку или сделать запрос рекурсивным по всем папкам. - person Servy; 18.06.2015
comment
CamlexNET nuget / extension ОТСУТСТВУЕТ ЭТОГО, он создает потрясающий caml, но не упаковывает его для просмотра. Спасибо! - person Max; 10.11.2016
comment
@MaxGrass Скорее всего, он был написан для написания CAML для кода на стороне сервера, где он запрашивает XML запроса отдельно от других элементов представления. - person Servy; 10.11.2016