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 лет опыта в области системной интеграции и разработки программного обеспечения. Специализируюсь на проектировании и внедрении масштабируемых высокопроизводительных программных решений в различных отраслях.