Сегодня коллега показал мне очень удобное средство для построения CAML запросов - Camlex.NET. Это средство позволяет очень удобно при помощи лямбда выражений строить запросы, причем даже динамические. Приведу один пример запроса(на странице по ссылке много примеров).
Так выглядит CAML запрос:
А так его можно сделать с помощью Camlex:
Гораздо короче и быстрее читается.
Неудобно в случае, когда название полей не английские вместо x["Поле"] писать x[List.Fields["Поле"].Id]. На codeplex ребята быстро отвечали на мои вопросы, это тоже очень приятно.
Так выглядит 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 ребята быстро отвечали на мои вопросы, это тоже очень приятно.
добрый день
ОтветитьУдалитьобращение к полям по 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-е гораздо больше других узких мест, по сравнению с которыми это улучшение картину не изменит
Вечер добрый!
ОтветитьУдалитьAlex, спасибо за замечание!
Да, я ошибся и забыл про пост. Сейчас появилось время и исправил текст статьи.
добрый день!
ОтветитьУдалитьstring caml = Camlex.Query()
.Where(x => (int)x["ID"] == 2)
.ToString();
- приводит к исключительной ситуации, даже try не спасает.
версия camlex 2.0 и 2.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)
Я хотела именно camlex "пощупать"
ОтветитьУдалитьвылетает "Ошибка сервера в приложении '/'" с указанием смотреть web.config
Для того, чтобы увидеть текст ошибки можно пойти одним из двух путей: внести правки в web.config (customerror установить в false и stackTrace и true) или прицепить visual studio к процессу w3p.exe и открыть страницу на которой происходитошибка, это можно сделать нажав f5 в visual studio и открыв страницу на которой у вас уже расположена веб-часть.
ОтветитьУдалитьЕсли цель - пощупать camlex, то я бы посоветовал использовать консольное приложение, а не веб-часть. Значительно быстрее отлавливать ошибки и компилировать.
при F5 - вылетает как только вызывается процедура содержащая Camplex.Query(), даже не проходя по предшествующим ей посторонним строкам, без строки с Camplex - всё ок
ОтветитьУдалитьweb.config из папки портала config или в проекте?, в самом проекте - нет конфига.
web.config в папке веб приложения. К ней можно пройти через iis manager. Настоятено рекомендую сначала сделать бекап.
ОтветитьУдалить>при F5 - вылетает как только вызывается процедура содержащая Camplex.Query()
а текст ошибки какой?
точно такой же (((
ОтветитьУдалитьизменение customerror ничего не меняет
программа воспринимает string s=camlex.Now, правда ничего не возвращая,
но на Query сыпется
ElenXYZ, я не смогу вам помочь, если вы не напишите текст ошибки
ОтветитьУдалить