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-запросов) можно использовать эти поля. Надеюсь пригодится.