Лучший отвечающий
Фильтрация. Из SPListItemCollection в GridView

Вопрос
-
Добрый день, подскажите как ловчее реализовать фильтрацию?
У меня есть коллекция SPListItemCollection, полученная с помощью CAML-запроса из SPList.
и есть GridView на aspx-странице, в котором очень хорошо эта коллекция выводится с помощь myCollection.GetDataTable()
Вопрос в том как в промежуточном этапе можно фильтровать эту коллекцию, чтобы в GridView выводить только нужные элементы? уже по всякому пробовала и везде происходил затык) хочется найти верное направление :)
13 мая 2015 г. 12:41
Ответы
-
Добрый день,
посмотрев еще раз документацию по CAMPLEX можно обнаружить такой код (вы немного не дочитали до конца страницы):
public static class ExpressionsHelper
Примените CombineAnd и CombineOr.
{
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();
- Помечено в качестве ответа wmariadonna 19 мая 2015 г. 7:49
18 мая 2015 г. 9:22
Все ответы
-
Добрый день,
1. Что вы имеет ввиду под промежуточным этапом?
2. уже по всякому пробовала и везде происходил затык - что именно пробовали и что не получается?
14 мая 2015 г. 0:39 -
Вообще задача такая: вывести данные на основе фильтров. По идее нужно написать динамический CAML, но я не представляю как он должен выглядеть, тк у меня будет неограниченное число параметров для фильтрации.
Ну вот поэтому я и пробую тут возится со списками и коллекциями посредством foreach. И везде то тип привести нельзя, то коллекцию менять не выходит. Хочется именно задействовать GridView чтобы туда вывести найденные элементы.
14 мая 2015 г. 4:54 -
Всем спасибо, я сама нашла решение.
вот оно 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
15 мая 2015 г. 7:09 -
Добрый день,
CAMLEX надо использовать всем и забыть CAML как страшный сон.
15 мая 2015 г. 9:00 -
у меня проблема с камлекс...
не пойму как сделать запрос.
синтаксис позволяет написать вот так:
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)); }
15 мая 2015 г. 11:32 -
Добрый день,
CAMLEX формирует один запрос к списку, а вы пытаетесь заставить его работать как Lynq запрос.
В вашем случае необходимо использовать операцию AND в CAML или это будет && в CAMLEX.
18 мая 2015 г. 0:56 -
Хорошо, а как мне сделать это динамически? У меня складывается ощущение что моя задача проста и нерешаема одновременно :)
Мне нужно сделать поиск по 3 обязательным параметрам с AND
и по неограниченному числу параметров с OR
18 мая 2015 г. 6:47 -
Добрый день,
посмотрев еще раз документацию по CAMPLEX можно обнаружить такой код (вы немного не дочитали до конца страницы):
public static class ExpressionsHelper
Примените CombineAnd и CombineOr.
{
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();
- Помечено в качестве ответа wmariadonna 19 мая 2015 г. 7:49
18 мая 2015 г. 9:22 -
Максим, спасибо вам огромное! И правда не сразу увидела нужную информацию в мануале :)
Применила CombineAnd и CombineOr - все отлично сработало! Проблема решена!
19 мая 2015 г. 7:49