Использование CAML для сравнения полей «Персона или группа» в SharePoint - PullRequest
2 голосов
/ 27 июля 2011

У меня есть список SharePoint 2007 (MOSS) с 2 столбцами «Персона или группа», которые я хотел бы сравнить, по сути:

SELECT * FROM List WHERE (Analyst = Developer)

В моем коде (C #) я построил это как:

SPQuery itemQuery = new SPQuery();
itemQuery.Query = "<Where><Eq><FieldRef Name='Analyst' /><FieldRef Name='Developer' /></Eq></Where>";

SPListItemCollection queryResults = list.GetItems(itemQuery);

Но это вызывает исключение («Исключение из HRESULT: 0x80020009 (DISP_E_EXCEPTION)»).

Я видел некоторую информацию относительно атрибута Type элемента Value, когдасравнение со столбцом «Персона или группа», но ничего не сравнивается с сопоставлением двух этих столбцов друг с другом.

Я также попытался добавить «LookupId = 'TRUE'» к каждому FieldRef без изменений.

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

Невозможно сравнить два таких поля, используя CAML. Вы должны использовать буквальное значение. Это означает, что у вас, скорее всего, будет два запроса:

  1. Получить ID пользователя аналитика / разработчика
  2. Получить элементы, где аналитик и разработчик совпадают

Пример # 2:

<Where>
   <And>
      <Eq><FieldRef Name="Analyst" LookupId="TRUE"/><Value Type="Integer">42</Value></Eq>
      <Eq><FieldRef Name="Developer" LookupId="TRUE"/><Value Type="Integer">42</Value></Eq>
   </And>
</Where>

К вашему сведению, вы также можете использовать <UserID/> для «Текущий пользователь» вместо идентификатора пользователя (в данном примере 42).

1 голос
/ 29 июля 2011

Логика, которую вы ищете, я полагаю, такова:

<Where>
   <Eq>
      <FieldRef Name='Analyst'/>
      <Value Type="Text"><FieldRef Name='Developer'/></Value>
   </Eq>
</Where>

Я проверил, и это невозможно, поэтому, как я вижу, есть два варианта:

  1. Получить все элементы списка, затем перебрать JQuery с находкой и сравнить для двух равных полей.

  2. Создать вычисляемый столбец, который устанавливает true или falseзначение, если два столбца равны в списке, а затем выберите на основе этого столбца.Это, вероятно, наиболее целесообразно, а также наиболее эффективно с точки зрения производительности.

0 голосов
/ 28 июля 2011

Попробуйте это:

<Where> 
  <Eq> 
    <FieldRef Name="Analyst" /> 
    <Value Type="Text">Developer</Value> 
  </Eq> 
</Where>

Я нашел список, который имеет два совпадающих значения для сравнения, и получил запрос CAML для работы со сравнением;однако это логическое значение, поэтому я не уверен, что это то, что вы ищете.Он сравнивает два поля, но я думаю, что литерал все еще мешает.Этот список содержит около 25 записей, и это единственное совпадение, поэтому я подумал, что это будет хорошим тестом.

Вот код:

private DataTable ExecuteQuery(SPList list) 
{ 
   SPQuery qry = new SPQuery(); 
 qry.Query = "<Where><And><Contains><FieldRef Name='Show' /><Value       Type='Boolean'>1</Value></Contains><Contains><FieldRef Name='Highlight' /><Value     Type='Boolean'>1</Value></Contains></And></Where>"; 
qry.ViewFields = "<FieldRef Name='Show' /><FieldRef Name='Highlight' />"; 
qry.IncludeMandatoryColumns = true; 
return list.GetItems(qry).GetDataTable();

Извините, если это не то, что вы ищете.Удачи !!

...