Linq to SharePoint. Мапинг полей

Сегодня я покажу как можно описать поля списка SharePoint для использования их в запросах. А именно, как добиться построение правильного CAML-запроса и в каких случаях этого сделать нельзя.

Уникальный идентификатор

Чтобы использовать уникальный идентификатор элемента списка в классе Linq to SharePoint, надо описать поле "GUID", указав его тип - "Guid":

/// <summary>
/// Уникальный идентификатор
/// </summary>
[Column(Name = "GUID", Storage = "_guid", ReadOnly = true, FieldType = "Guid")]
public Guid GUID
{
    get
    {
        return _guid;
    }
    set
    {
        if ((value == _guid)) return;
        OnPropertyChanging("GUID", _guid);
        _guid = value;
        OnPropertyChanged("GUID");
    }
}
private Guid _guid;

Кем создан/изменен

Поля, содержащие информацию о пользователе создавшем/изменившем элемент списка есть ничто иное как Lookup-поля. И помечаем их атрибутами ColumnAttribute соответственно:

/// <summary>
/// Кем изменен
/// </summary>
[Column(Name = "Editor", Storage = "_updateBy", 
 ReadOnly = true, FieldType = "User", IsLookupValue = true)]
public string UpdateBy
{
    get
    {
        return _updateBy;
    }
    set
    {
        if ((value == _updateBy)) return;
        OnPropertyChanging("UpdateBy", _updateBy);
        _updateBy = value;
        OnPropertyChanged("UpdateBy");
    }
}
private string _updateBy;
 
/// <summary>
/// ID пользователя, изменившего элемент
/// </summary>
[Column(Name = "Editor", Storage = "_updateById", 
 ReadOnly = true, FieldType = "User", IsLookupId = true)]
public int? UpdateById
{
    get
    {
        return _updateById;
    }
    set
    {
        if ((value == _updateById)) return;
        OnPropertyChanging("UpdateById", _updateById);
        _updateById = value;
        OnPropertyChanged("UpdateById");
    }
}
private int? _updateById;

Аналогично описывается поле CreateBy (InternalName - Author). Поля "Создан" и "Изменен" описываются как обычные поля с типом Дата.

Поля таксономии

При описании полей таксономии тип поля надо указывать TaxonomyFieldValue и TaxonomyFieldValueCollection для полей с единственным и множественным выбором соответственно:

[Column(Name = "Tag", Storage = "_tag", FieldType = "TaxonomyFieldType")]
public TaxonomyFieldValue Tag
{
    get
    {
        return _tag;
    }
    set
    {
        if ((value == _tag)) return;
        OnPropertyChanging("Tag", _tag);
        _tag = value;
        OnPropertyChanged("Tag");
    }
}
private TaxonomyFieldValue _tag;
 
[Column(Name = "Tags", Storage = "_tags", FieldType = "TaxonomyFieldTypeMulti")]
public TaxonomyFieldValueCollection Tags
{
    get
    {
        return _tags;
    }
    set
    {
        if ((value == _tags)) return;
        OnPropertyChanging("Tags", _tags);
        _tags = value;
        OnPropertyChanged("Tags");
    }
}
private TaxonomyFieldValueCollection _tags;

Здесь есть одна особенность: при построении запросов, правильный CAML-запрос будет строиться только в случае проверки этих полей на равенство или неравенство null. В любом другом случае Linq to SharePoint не сможет разобрать выражение и инициализирует выгрузку данных из списка.

Остальные поля я подробно описывать не буду. Просто приведу атрибуты ColumnAtrribute для них.

Версия

[Column(Name = "owshiddenversion", Storage = "_version", 
 ReadOnly = true, FieldType = "Integer")]
public int? Version

Имя файлы

Имя файла без расширения

[Column(Name = "BaseName", Storage = "_baseName", 
 ReadOnly = true, FieldType = "Computed")]
public string BaseName

Путь к файлу

Путь к файлу относительно сервера

[Column(Name = "ServerUrl", Storage = "_serverUrl", 
 ReadOnly = true, FieldType = "Computed")]
public string ServerUrl

Использование

Для построения запросов (именно правильных CAML-запросов) можно использовать эти поля. Надеюсь пригодится.

Виталий Жуков

Виталий Жуков

Техлид, Архитектор, Разработчик, Microsoft MVP. Более 20 лет опыта в области системной интеграции и разработки программного обеспечения. Специализируюсь на проектировании и внедрении масштабируемых высокопроизводительных программных решений в различных отраслях.

Смотрите также

Развертывание списков и библиотек с помощью SPFx-решений

Развертывание списков и библиотек с помощью SPFx-решений

SharePoint. Drag-and-Drop Загрузчик файлов

SharePoint. Drag-and-Drop Загрузчик файлов

CSOM. Загрузка файлов

CSOM. Загрузка файлов

SharePoint List REST API. Часть 2

SharePoint List REST API. Часть 2

SharePoint Framework. Создание веб-части на Angular

SharePoint Framework. Создание веб-части на Angular

SharePoint List REST API. Часть 1

SharePoint List REST API. Часть 1

Презентация с доклада о SharePoint Framework

Презентация с доклада о SharePoint Framework

SharePoint Framework. Создаем AngularJS 1.x Client WebPart

SharePoint Framework. Создаем AngularJS 1.x Client WebPart

SharePoint. Регистрация CSS и JavaScript с помощью DelegateControl

SharePoint. Регистрация CSS и JavaScript с помощью DelegateControl

SharePoint. Расширяем REST API

SharePoint. Расширяем REST API

SharePoint Excel Services. Создаем кредитный калькулятор

SharePoint Excel Services. Создаем кредитный калькулятор

SharePoint Ribbon API. Использование ToggleButton

SharePoint Ribbon API. Использование ToggleButton

SharePoint 2013. How To: настройка входящей почты для разработчиков

SharePoint 2013. How To: настройка входящей почты для разработчиков

Мифы и правда о Linq to SharePoint

Мифы и правда о Linq to SharePoint

5 особенностей SPSiteDataQuery

5 особенностей SPSiteDataQuery

SharePoint 2013. Введение в SharePoint App. Часть 2

SharePoint 2013. Введение в SharePoint App. Часть 2

SharePoint 2013. Введение в SharePoint App. Часть 1

SharePoint 2013. Введение в SharePoint App. Часть 1

Превью для веб-части в SharePoint 2010/2013

Превью для веб-части в SharePoint 2010/2013

SharePoint 2013. Еще немного о новых контролах

SharePoint 2013. Еще немного о новых контролах

SharePoint 2013. Контрол ClientPeoplePicker

SharePoint 2013. Контрол ClientPeoplePicker

SharePoint 2013. Контрол ImageCrop

SharePoint 2013. Контрол ImageCrop

SharePoint 2013. Тип поля Geolocation

SharePoint 2013. Тип поля Geolocation

Создание типа поля в SharePoint

Создание типа поля в SharePoint

SharePoint 2010. Длительные операции с обновляемым статусом

SharePoint 2010. Длительные операции с обновляемым статусом

Linq to SharePoint. Создаем ContentIterator

Linq to SharePoint. Создаем ContentIterator

Linq to SharePoint. Получение данных из другой коллекции сайтов

Linq to SharePoint. Получение данных из другой коллекции сайтов

Linq to SharePoint. Версионность

Linq to SharePoint. Версионность

SharePoint. Получение URL-адреса иконки для документа

SharePoint. Получение URL-адреса иконки для документа

SharePoint 2010. PostBack для Fluent Ribbon API

SharePoint 2010. PostBack для Fluent Ribbon API

Linq to SharePoint. Блокировка документов

Linq to SharePoint. Блокировка документов

Linq to SharePoint. Паттерн Repository

Linq to SharePoint. Паттерн Repository

Linq to SharePoint. Получение мета-данных списка

Linq to SharePoint. Получение мета-данных списка

Linq to SharePoint. Формирование данных для ProcessBatchData

Linq to SharePoint. Формирование данных для ProcessBatchData

Linq to SharePoint. Сравнение производительности с Camlex.NET

Linq to SharePoint. Сравнение производительности с Camlex.NET

Linq to SharePoint. Часть 5. Поля Choice и MultiChoice

Linq to SharePoint. Часть 5. Поля Choice и MultiChoice

Linq to SharePoint. Часть 4. Dynamic LINQ

Linq to SharePoint. Часть 4. Dynamic LINQ

Linq to SharePoint. Особенности. Часть 3

Linq to SharePoint. Особенности. Часть 3

Linq to SharePoint. Особенности. Часть 2

Linq to SharePoint. Особенности. Часть 2

SharePoint 2010. PeopleEditor. Установка значения

SharePoint 2010. PeopleEditor. Установка значения

SharePoint 2010. Настройка входящей почты для кастомного списка

SharePoint 2010. Настройка входящей почты для кастомного списка

Linq to Sharepoint. Особенности

Linq to Sharepoint. Особенности

EntityFramework. Оптимистические блокировки

EntityFramework. Оптимистические блокировки