Получить значение из SPFieldUser с AllowMultipleValues ​​не удается только в задании таймера

Это странно

Я выполняю этот код в задании таймера в SharePoint 2010 ...

...
// Get the field by it's internal name
SPField field = item.Fields.GetFieldByInternalName(fieldInternalName);

if (field != null)
{
     SPFieldUser userField = (SPFieldUser)field;
     object value = null;

     if (userField.AllowMultipleValues)
     {
          // Bug when getting field value in a timer job? Throws an ArgumentException
          users = new SPFieldUserValueCollection(item.ParentList.ParentWeb, item[userField.Id].ToString());
     }
     else
     {
          // Get the value from the field, no exception
          value = item[userField.Id];
     }
}
...

Этот код отлично работает при запуске в простом ConsoleApplication, но при запуске в контексте задания таймера в SharePoint 2010 он выдает исключение ArgumentException в строке...

users = new SPFieldUserValueCollection(item.ParentList.ParentWeb, item[userField.Id].ToString());

Я перепробовал множество вариантов, чтобы получить значение из SPFieldUser, но все они терпят неудачу только тогда, когда его выполняет задание таймера, а для свойства AllowMultipleValues ​​установлено значение TRUE.

Я попытался отладки с помощью Reflector, и кажется, что здесь, в SPListItem, создается исключение...

public object this[Guid fieldId]
{
  get
  {
    SPField fld = this.Fields[fieldId];
    if (fld == null)
    {
      throw new ArgumentException();
    }
    return this.GetValue(fld, -1, false);
}
...

И это здесь будет трассировка стека исключений...

System.ArgumentException was caught
Message=Value does not fall within the expected range.
Source=Microsoft.SharePoint
StackTrace:
     at Microsoft.SharePoint.SPFieldMap.GetColumnNumber(String strFieldName, Boolean bThrow)
     at Microsoft.SharePoint.SPListItemCollection.GetColumnNumber(String groupName, Boolean bThrowException)
     at Microsoft.SharePoint.SPListItemCollection.GetRawValue(String fieldname, Int32 iIndex, Boolean bThrow)
     at Microsoft.SharePoint.SPListItem.GetValue(SPField fld, Int32 columnNumber, Boolean bRaw, Boolean bThrowException)
     at Microsoft.SharePoint.SPListItem.get_Item(Guid fieldId)
     at FOCAL.Point.Applications.Audits.AuditUtility.GetPeopleFromField(SPListItem item, String fieldInternalName)

Вздох... есть мысли?

2 ответа

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

Как правило, это означает, что вы запросили слишком много полей поиска в одном SPQuery, что приведет к слишком большому количеству самостоятельных соединений таблицы истинного просмотра в базе данных контента, если SharePoint Foundation не ограничит ресурсы. Для обычных пользователей существует пороговое значение, равное 8 поискам на запрос. Убедитесь, что ваш запрос возвращает только необходимые поля поиска или лица / группы. Если вы не можете уменьшить использование, подумайте об изменении настройки порога.

Другие вопросы по тегам