вторник, 11 января 2011 г.

Camlex.NET - очень удобное средство для построения CAML запросов

Сегодня коллега показал мне очень удобное средство для построения CAML запросов - Camlex.NET. Это средство позволяет очень удобно при помощи лямбда выражений строить запросы, причем даже динамические. Приведу один пример запроса(на странице по ссылке много примеров).
Так выглядит CAML запрос:


<Where>
  <IsNotNull>
    <FieldRef Name="Status" />
  </IsNotNull>
</Where><GroupBy>
  <FieldRef Name="Author" />
</GroupBy>

А так его можно сделать с помощью Camlex:
var caml =
    Camlex.Query()
        .Where(x => x["Status"] != null)
        .GroupBy(x => x["Author"]).ToString();

Гораздо короче и быстрее читается.

Неудобно в случае, когда название полей не английские вместо x["Поле"] писать x[List.Fields["Поле"].Id]. На codeplex ребята быстро отвечали на мои вопросы, это тоже очень приятно.

10 комментариев:

  1. добрый день
    обращение к полям по Guid поддерживается в Camlex-е:
    [Test]
    public void test_THAT_expression_with_spbuiltinfield_IS_translated_sucessfully()
    {
    string caml = Camlex.Query().Where(x => (string)x[SPBuiltInFieldId.Title] == "foo").ToString();

    string expected =
    " < Where >" +
    " < Eq >" +
    " < FieldRef ID=\"fa564e0f-0c70-4ab9-b863-0177e6ddd247\" / >" +
    " < Value Type=\"Text\" >foo< /Value >" +
    " < /Eq >" +
    " < /Where >";

    Assert.That(caml, Is.EqualTo(expected).Using(new CamlComparer()));
    }
    это тест из исходников Camlex-а (я пробелы в теги вставил, чтобы не обрезались). Только толку в смысле производительности будет чуть. В Sharepoint-е гораздо больше других узких мест, по сравнению с которыми это улучшение картину не изменит

    ОтветитьУдалить
  2. Вечер добрый!

    Alex, спасибо за замечание!

    Да, я ошибся и забыл про пост. Сейчас появилось время и исправил текст статьи.

    ОтветитьУдалить
  3. добрый день!
    string caml = Camlex.Query()
    .Where(x => (int)x["ID"] == 2)
    .ToString();
    - приводит к исключительной ситуации, даже try не спасает.
    версия camlex 2.0 и 2.4

    ОтветитьУдалить
  4. Привет, ElenXYZ!

    С виду написанно правильно. А что написанно в тексте ошибки?

    Если нужно выбрать один элемент по ID, то лучше использовать метод SPList.GetItemById (http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splist.getitembyid.aspx) или SPList.GetItemByIdSelectedFields
    (http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splist.getitembyidselectedfields.aspx)

    ОтветитьУдалить
  5. Я хотела именно camlex "пощупать"

    вылетает "Ошибка сервера в приложении '/'" с указанием смотреть web.config

    ОтветитьУдалить
  6. Для того, чтобы увидеть текст ошибки можно пойти одним из двух путей: внести правки в web.config (customerror установить в false и stackTrace и true) или прицепить visual studio к процессу w3p.exe и открыть страницу на которой происходитошибка, это можно сделать нажав f5 в visual studio и открыв страницу на которой у вас уже расположена веб-часть.

    Если цель - пощупать camlex, то я бы посоветовал использовать консольное приложение, а не веб-часть. Значительно быстрее отлавливать ошибки и компилировать.

    ОтветитьУдалить
  7. при F5 - вылетает как только вызывается процедура содержащая Camplex.Query(), даже не проходя по предшествующим ей посторонним строкам, без строки с Camplex - всё ок

    web.config из папки портала config или в проекте?, в самом проекте - нет конфига.

    ОтветитьУдалить
  8. web.config в папке веб приложения. К ней можно пройти через iis manager. Настоятено рекомендую сначала сделать бекап.

    >при F5 - вылетает как только вызывается процедура содержащая Camplex.Query()
    а текст ошибки какой?

    ОтветитьУдалить
  9. точно такой же (((

    изменение customerror ничего не меняет
    программа воспринимает string s=camlex.Now, правда ничего не возвращая,
    но на Query сыпется

    ОтветитьУдалить
  10. ElenXYZ, я не смогу вам помочь, если вы не напишите текст ошибки

    ОтветитьУдалить