SharePoint 2007. Максимальное/минимальное значение поля в списке

Сегодня я покажу как в SharePoint можно получать минимальное/максимальное значение поля списка.

Решение

Решение заключается в том, что мы будем просто сортировать элементы по данному полю от предыдущего к последующему при получении минимального значения (или наоборот для получения максимального). А также будем ограничивать кол-во элементов одним.

Для удобства я сделал метод-расширитель для SPListItem, который принимает в качестве параметра внутреннее имя поля. Здесь я буду приводить методы для получения максимального значения. Получение минимального значения будет отличаться только направлением сортировки.

  1. /// <summary>
  2. /// Максимальное значение поля списка
  3. /// </summary>
  4. /// <typeparam name="T">Тип значений в поле</typeparam>
  5. /// <param name="list">Список</param>
  6. /// <param name="fieldInternalName">Внутреннее имя поля</param>
  7. public static T GetMaxValue<T>(this SPList list, string fieldInternalName)
  8. {
  9.     var query = new SPQuery
  10.     {
  11.         // Берем только поле, которое нас интересует
  12.         ViewFields = string.Format("<FieldRef Name='{0}' />", fieldInternalName),
  13.         // Строим запрос из предиката и сортировки от большего к меньшему
  14.         Query = string.Format(@"<OrderBy><FieldRef Name='{0}' Ascending='False' /></OrderBy>"
  15.         fieldInternalName),
  16.         // Берем только первую строку
  17.         RowLimit = 1
  18.     };
  19.     // Выполняем запрос
  20.     var items = list.GetItems(query).Cast<SPListItem>();
  21.     // Если коллекция пуста (например, в списке нет элементов), 
  22.     // то возвращаем значение по умолчанию для типа
  23.     if (items.Count() == 0) return default(T);
  24.     // Возвращаем значение поля
  25.     return items.First()[fieldInternalName] is T ? (T)(items.First()[fieldInternalName]) : default(T);
  26. }

Чтобы нарастить функциональность, можно добавить еще один параметр - wherePredicate и передавать CAML-запрос для предварительной фильтрации данных. Можно будет отфильтровать пустые значения перед тем как искать минимальное значение, например:

  1. /// <summary>
  2. /// Максимальное значение поля списка
  3. /// </summary>
  4. /// <typeparam name="T">Тип поля</typeparam>
  5. /// <param name="list">Список</param>
  6. /// <param name="fieldInternalName">Внутреннее имя поля</param>
  7. /// <param name="wherePredicat">Предикат для предварительной фильтрации</param>
  8. public static T GetMaxValue<T>(this SPList list, string fieldInternalName, string wherePredicat)
  9. {
  10.     var query = new SPQuery
  11.     {
  12.         // Берем только поле, которое нас интересует
  13.         ViewFields = string.Format("<FieldRef Name='{0}' />", fieldInternalName),
  14.         // Строим запрос из предиката и сортировки от большего к меньшему
  15.         Query = string.Format(
  16.             @"{0}<OrderBy><FieldRef Name='{1}' Ascending='False' /></OrderBy>"
  17.             wherePredicat, fieldInternalName),
  18.         // Берем только первую строку
  19.         RowLimit = 1
  20.     };
  21.     // Выполняем запрос
  22.     var items = list.GetItems(query).Cast<SPListItem>();
  23.     // Если коллекция пуста (например, в списке нет элементов), 
  24.     // то возвращаем значение по умолчанию для типа
  25.     if (items.Count() == 0) return default(T);
  26.     // Возвращаем значение поля
  27.     return items.First()[fieldInternalName] is T 
  28.         ? (T)(items.First()[fieldInternalName]) 
  29.         : default(T);
  30. }

Применение

Например для получения максимальной даты создания и максимального значения ID:

  1. var maxCreated = list.GetMaxValue<DateTime>("Created");
  2. var maxId = list.GetMaxValue<int>("ID");

Надеюсь, пригодится.


Поделиться

Коментарии