Динамический LINQ Query в SharePoint - PullRequest
1 голос
/ 25 ноября 2010

У меня есть страница с фильтрами, и в соответствии с тем, что выбирает пользователь, она должна сгенерировать запрос.Я использую этот код:

var riskitem = (from risk in context.RisksList
                        where risk.ProjectCode == sProjectCode &&
                                    (
                                        (search == "" && status == "" && ispublic == TriState.NA) ||
                                        (search != "" && (
                                            (!String.IsNullOrEmpty(risk.Description) && risk.Description.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) ||
                                            (!String.IsNullOrEmpty(risk.Title) && risk.Title.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) ||
                                            (risk.Probability.HasValue && risk.Probability.Value.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) ||
                                            (!String.IsNullOrEmpty(risk.Mitigation) && risk.Mitigation.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) ||
                                            (!String.IsNullOrEmpty(risk.Observations) && risk.Observations.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0)
                                        )) ||
                                        (
                                            (status != "" && risk.Status.Value.ToString() == status) ||
                                            (status == "" && search != "" && risk.Status.Value.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0)
                                        ) ||
                                        (
                                            (ispublic != TriState.NA && ((risk.IsPublic.Value && ispublic == TriState.True) || (!risk.IsPublic.Value && ispublic == TriState.False))) ||
                                            (ispublic == TriState.NA && search != "" && risk.IsPublic.HasValue && risk.IsPublic.Value.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0)
                                        )
                                    )
                        select risk).Take((pagesize * (pageindex + 1)) + 1);

Однако Linq-To-Sharepoint не конвертирует большую часть этого в CAML, и список, который я запрашиваю, содержит более 50000 элементов.Требуется приблизительно 4-8 секунд, чтобы получить предметы, которые не приемлемы.Я пытался сгенерировать динамический запрос, но до сих пор не смог заставить его работать.С помощью операций И ​​и ИЛИ для генерации запроса я мог бы наложить все эти условия на код и повысить производительность.

Если кто-то может помочь, я был бы признателен.

1 Ответ

1 голос
/ 29 ноября 2010

Я отказался от использования linq для совместного использования для больших списков со сложными фильтрами предикатов. У меня была гораздо лучшая производительность с использованием объединений и / или слияния данных из результатов splistitemcollection результатов SPQuery.

Похоже, что вы дублируете работу поисковой системы sharepoint. Задумывались ли вы о том, можно ли заменить что-то вроде ключевых слов или полнотекстовых классов запросов?

Кроме того, вы должны быть в состоянии устранить необходимость выполнять повторную оценку, такую ​​как проверка на наличие пустой строки И indexof. то есть ... просто что-то вроде

Risk.IsPublic.Value.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1

Что такое тип данных для IsPublic? Если это логическое поле, вы также можете сэкономить некоторое время без дополнительных преобразований.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...