none
Фильтрация. Из SPListItemCollection в GridView RRS feed

  • Вопрос

  • Добрый день, подскажите как ловчее реализовать фильтрацию?

    У меня есть коллекция SPListItemCollection, полученная с помощью CAML-запроса из SPList.

    и есть GridView на aspx-странице, в котором очень хорошо эта коллекция выводится с помощь myCollection.GetDataTable()

    Вопрос в том как в промежуточном этапе можно фильтровать эту коллекцию, чтобы в GridView выводить только нужные элементы? уже по всякому пробовала и везде происходил затык) хочется найти верное направление :)

Ответы

  • Добрый день,

    посмотрев еще раз документацию по CAMPLEX можно обнаружить такой код (вы немного не дочитали до конца страницы):

    public static class ExpressionsHelper
    {
        public static Expression<Func<SPListItem, bool>> CombineAnd(
            IEnumerable<Expression<Func<SPListItem, bool>>> expressions)
        {
            ...
        }
     
        public static Expression<Func<SPListItem, bool>> CombineOr(
            IEnumerable<Expression<Func<SPListItem, bool>>> expressions)
        {
            ...
        }
    }

    // Language = Russian or Language = English var languageConditions = new List<Expression<Func<SPListItem, bool>>>(); languageConditions.Add(x => (string)x["Language"] == "Russian"); languageConditions.Add(x => (string)x["Language"] == "English"); var langExpr = ExpressionsHelper.CombineOr(languageConditions); // FileLeafRef contains “.docx” or FileLeafRef contains “.xlsx” or ... var extenssionsConditions = new List<Expression<Func<SPListItem, bool>>>(); var extensions = new[] {".docx", ".xlsx", ".pptx"}; foreach (string e in extensions) { string ext = e; extenssionsConditions.Add(x => ((string)x["FileLeafRef"]).Contains(ext)); } var extExpr = ExpressionsHelper.CombineOr(extenssionsConditions); // (Language = Russian or Language = English) and // (FileLeafRef contains “.docx” or FileLeafRef contains “.xlsx” or ...) var expressions = new List<Expression<Func<SPListItem, bool>>>(); expressions.Add(langExpr); expressions.Add(extExpr); string query = CamlexNET.Camlex.Query().WhereAll(expressions).ToString();

    Примените CombineAnd и CombineOr.

    • Помечено в качестве ответа wmariadonna 19 мая 2015 г. 7:49

Все ответы

  • Добрый день,

    1. Что вы имеет ввиду под промежуточным этапом?

    2. уже по всякому пробовала и везде происходил затык  - что именно пробовали и что не получается?

  • Вообще задача такая: вывести данные на основе фильтров. По идее нужно написать динамический CAML, но я не представляю как он должен выглядеть, тк у меня будет неограниченное число параметров для фильтрации.

    Ну вот поэтому я и пробую тут возится со списками и коллекциями посредством foreach. И везде то тип привести нельзя, то коллекцию менять не выходит. Хочется именно задействовать GridView чтобы туда вывести найденные элементы.

  • Всем спасибо, я сама нашла решение.

    вот оно http://camlex.codeplex.com/ замечательный CAMLEX! с ним очень удобно стоить динамические запросы и не вдаваться в дебри малопривлекательного синтаксиса CAML :)

    пример кода:

    // list of tokens
    var tokens = new List<string> { "hello", "greeting", "hi" };
    var expressions = new List<Expression<Func<SPListItem, bool>>>();
    
    // create lambda expression for each token in list
    foreach (string t in tokens)
    {
        string token = t;
       expressions.Add(x => ((string)x["Title"]).Contains(token));
    }
    
    // prepare query
    var caml = Camlex.Query().WhereAny(expressions).ToString();
    

    • Помечено в качестве ответа wmariadonna 15 мая 2015 г. 7:10
    • Снята пометка об ответе wmariadonna 15 мая 2015 г. 11:32
  • Добрый день,

    CAMLEX надо использовать всем и забыть CAML как страшный сон.

  • у меня проблема с камлекс...

    не пойму как сделать запрос.

    синтаксис позволяет написать вот так:

    mainQuery.Query = Camlex.Query().WhereAll(expressions).WhereAny(expressionsContractors).ToString();

    но результатом будет только поиск

    WhereAny(expressionsContractors)

    как заставить работать?

    параметры для expressions и expressionsContractors набираю динамически (пример):

    if (item.Selected)
    {
    string contractor = item.Text;
    expressionsContractors.Add(x => ((string)x[fnFileLeafRef]).Contains(contractor));
    }

  • Добрый день,

    CAMLEX формирует один запрос к списку, а вы пытаетесь заставить его работать как Lynq запрос.

    В вашем случае необходимо использовать операцию AND в CAML или это будет && в CAMLEX.

  • Хорошо, а как мне сделать это динамически? У меня складывается ощущение что моя задача проста и нерешаема одновременно :)

    Мне нужно сделать поиск по 3 обязательным параметрам с AND

    и по неограниченному числу параметров с OR

  • Добрый день,

    посмотрев еще раз документацию по CAMPLEX можно обнаружить такой код (вы немного не дочитали до конца страницы):

    public static class ExpressionsHelper
    {
        public static Expression<Func<SPListItem, bool>> CombineAnd(
            IEnumerable<Expression<Func<SPListItem, bool>>> expressions)
        {
            ...
        }
     
        public static Expression<Func<SPListItem, bool>> CombineOr(
            IEnumerable<Expression<Func<SPListItem, bool>>> expressions)
        {
            ...
        }
    }

    // Language = Russian or Language = English var languageConditions = new List<Expression<Func<SPListItem, bool>>>(); languageConditions.Add(x => (string)x["Language"] == "Russian"); languageConditions.Add(x => (string)x["Language"] == "English"); var langExpr = ExpressionsHelper.CombineOr(languageConditions); // FileLeafRef contains “.docx” or FileLeafRef contains “.xlsx” or ... var extenssionsConditions = new List<Expression<Func<SPListItem, bool>>>(); var extensions = new[] {".docx", ".xlsx", ".pptx"}; foreach (string e in extensions) { string ext = e; extenssionsConditions.Add(x => ((string)x["FileLeafRef"]).Contains(ext)); } var extExpr = ExpressionsHelper.CombineOr(extenssionsConditions); // (Language = Russian or Language = English) and // (FileLeafRef contains “.docx” or FileLeafRef contains “.xlsx” or ...) var expressions = new List<Expression<Func<SPListItem, bool>>>(); expressions.Add(langExpr); expressions.Add(extExpr); string query = CamlexNET.Camlex.Query().WhereAll(expressions).ToString();

    Примените CombineAnd и CombineOr.

    • Помечено в качестве ответа wmariadonna 19 мая 2015 г. 7:49
  • Максим, спасибо вам огромное! И правда не сразу увидела нужную информацию в мануале :)

    Применила CombineAnd и CombineOr - все отлично сработало! Проблема решена!