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

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

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

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

  1. /// <summary>
  2. /// Уникальный идентификатор
  3. /// </summary>
  4. [Column(Name = "GUID", Storage = "_guid", ReadOnly = true, FieldType = "Guid")]
  5. public Guid GUID
  6. {
  7.     get
  8.     {
  9.         return _guid;
  10.     }
  11.     set
  12.     {
  13.         if ((value == _guid)) return;
  14.         OnPropertyChanging("GUID", _guid);
  15.         _guid = value;
  16.         OnPropertyChanged("GUID");
  17.     }
  18. }
  19. private Guid _guid;

Кем/когда создан/изменен элемент

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

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

  1. /// <summary>
  2. /// Кем изменен
  3. /// </summary>
  4. [Column(Name = "Editor", Storage = "_updateBy"
  5.  ReadOnly = true, FieldType = "User", IsLookupValue = true)]
  6. public string UpdateBy
  7. {
  8.     get
  9.     {
  10.         return _updateBy;
  11.     }
  12.     set
  13.     {
  14.         if ((value == _updateBy)) return;
  15.         OnPropertyChanging("UpdateBy", _updateBy);
  16.         _updateBy = value;
  17.         OnPropertyChanged("UpdateBy");
  18.     }
  19. }
  20. private string _updateBy;
  21.  
  22. /// <summary>
  23. /// ID пользователя, изменившего элемент
  24. /// </summary>
  25. [Column(Name = "Editor", Storage = "_updateById"
  26.  ReadOnly = true, FieldType = "User", IsLookupId = true)]
  27. public int? UpdateById
  28. {
  29.     get
  30.     {
  31.         return _updateById;
  32.     }
  33.     set
  34.     {
  35.         if ((value == _updateById)) return;
  36.         OnPropertyChanging("UpdateById", _updateById);
  37.         _updateById = value;
  38.         OnPropertyChanged("UpdateById");
  39.     }
  40. }
  41. private int? _updateById;

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

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

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

  1. [Column(Name = "Tag", Storage = "_tag", FieldType = "TaxonomyFieldType")]
  2. public TaxonomyFieldValue Tag
  3. {
  4.     get
  5.     {
  6.         return _tag;
  7.     }
  8.     set
  9.     {
  10.         if ((value == _tag)) return;
  11.         OnPropertyChanging("Tag", _tag);
  12.         _tag = value;
  13.         OnPropertyChanged("Tag");
  14.     }
  15. }
  16. private TaxonomyFieldValue _tag;
  17.  
  18. [Column(Name = "Tags", Storage = "_tags", FieldType = "TaxonomyFieldTypeMulti")]
  19. public TaxonomyFieldValueCollection Tags
  20. {
  21.     get
  22.     {
  23.         return _tags;
  24.     }
  25.     set
  26.     {
  27.         if ((value == _tags)) return;
  28.         OnPropertyChanging("Tags", _tags);
  29.         _tags = value;
  30.         OnPropertyChanged("Tags");
  31.     }
  32. }
  33. private TaxonomyFieldValueCollection _tags;

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

Другие поля

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

Версия

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

Имя файлы

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

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

Путь к файлу

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

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

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

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


Поделиться

Коментарии