SharePoint 2007. Максимальное/минимальное значение поля в списке
Сегодня я покажу как в SharePoint можно получать минимальное/максимальное значение поля списка.
Решение
Решение заключается в том, что мы будем просто сортировать элементы по данному полю от предыдущего к последующему при получении минимального значения (или наоборот для получения максимального). А также будем ограничивать кол-во элементов одним.
Для удобства я сделал метод-расширитель для SPListItem, который принимает в качестве параметра внутреннее имя поля. Здесь я буду приводить методы для получения максимального значения. Получение минимального значения будет отличаться только направлением сортировки.
- /// <summary>
- /// Максимальное значение поля списка
- /// </summary>
- /// <typeparam name="T">Тип значений в поле</typeparam>
- /// <param name="list">Список</param>
- /// <param name="fieldInternalName">Внутреннее имя поля</param>
- public static T GetMaxValue<T>(this SPList list, string fieldInternalName)
- {
- var query = new SPQuery
- {
- // Берем только поле, которое нас интересует
- ViewFields = string.Format("<FieldRef Name='{0}' />", fieldInternalName),
- // Строим запрос из предиката и сортировки от большего к меньшему
- Query = string.Format(@"<OrderBy><FieldRef Name='{0}' Ascending='False' /></OrderBy>",
- fieldInternalName),
- // Берем только первую строку
- RowLimit = 1
- };
- // Выполняем запрос
- var items = list.GetItems(query).Cast<SPListItem>();
- // Если коллекция пуста (например, в списке нет элементов),
- // то возвращаем значение по умолчанию для типа
- if (items.Count() == 0) return default(T);
- // Возвращаем значение поля
- return items.First()[fieldInternalName] is T ? (T)(items.First()[fieldInternalName]) : default(T);
- }
Чтобы нарастить функциональность, можно добавить еще один параметр - wherePredicate и передавать CAML-запрос для предварительной фильтрации данных. Можно будет отфильтровать пустые значения перед тем как искать минимальное значение, например:
- /// <summary>
- /// Максимальное значение поля списка
- /// </summary>
- /// <typeparam name="T">Тип поля</typeparam>
- /// <param name="list">Список</param>
- /// <param name="fieldInternalName">Внутреннее имя поля</param>
- /// <param name="wherePredicat">Предикат для предварительной фильтрации</param>
- public static T GetMaxValue<T>(this SPList list, string fieldInternalName, string wherePredicat)
- {
- var query = new SPQuery
- {
- // Берем только поле, которое нас интересует
- ViewFields = string.Format("<FieldRef Name='{0}' />", fieldInternalName),
- // Строим запрос из предиката и сортировки от большего к меньшему
- Query = string.Format(
- @"{0}<OrderBy><FieldRef Name='{1}' Ascending='False' /></OrderBy>",
- wherePredicat, fieldInternalName),
- // Берем только первую строку
- RowLimit = 1
- };
- // Выполняем запрос
- var items = list.GetItems(query).Cast<SPListItem>();
- // Если коллекция пуста (например, в списке нет элементов),
- // то возвращаем значение по умолчанию для типа
- if (items.Count() == 0) return default(T);
- // Возвращаем значение поля
- return items.First()[fieldInternalName] is T
- ? (T)(items.First()[fieldInternalName])
- : default(T);
- }
Применение
Например для получения максимальной даты создания и максимального значения ID:
- var maxCreated = list.GetMaxValue<DateTime>("Created");
- var maxId = list.GetMaxValue<int>("ID");
Надеюсь, пригодится.