Linq для SharePoint с отличными результатами

#c# #linq #sharepoint #sharepoint-2010

#c# #linq #sharepoint #sharepoint-2010

Вопрос:

Я создаю фильтр поиска по алфавиту и хочу получать результаты из списка и показывать только доступные фильтры букв на основе результатов, содержащихся в списке. Теперь сложная часть: желаемый столбец — это поле «Люди», и я хочу получить только первую букву имени пользователя.

Прямо сейчас я могу использовать следующий код для запроса письма, но кто хочет запускать 26 запросов и замедлять загрузку страницы. Кроме того, все результаты будут отображаться для пользователей, которые начинаются с буквы a. Так что, я думаю, я мог бы ограничить возврат только одного результата, если бы это был единственный вариант.

 SPList UserActivity = web.Lists["User Activity"];

var varUserActivity = (from SPListItem UserActivityItem in UserActivity.Items
                    where UserActivityItem["Username"].ToString().Substring(UserActivityItem["Username"].ToString().IndexOf('#')   1, (UserActivityItem["Username"].ToString().Length - UserActivityItem["Username"].ToString().IndexOf('#')) - 1).ToLower().Replace("domain\","").StartsWith("a")
                    select UserActivityItem);

foreach (SPListItem uaitem in varUserActivity)
{
    this.Controls.Add(new LiteralControl(uaitem["Username"].ToString()   "<br>"));
}
 

Но я предпочитаю запускать один запрос, возвращая один результат для каждой уникальной буквы. С помощью этого списка пример данных:

  1. ДОМЕН Терра Бранфорд
  2. ДОМЕН Локк Коул
  3. ДОМЕН Сабин Фигаро
  4. ДОМЕН Сетцер Габбиани
  5. ДОМЕН Cyan Garamonde
  6. ДОМЕН Celes Chere
  7. ДОМЕН Cid Маркес

… ожидаемые результаты, которые должны быть возвращены:

  1. ДОМЕН Терра Бранфорд
  2. ДОМЕН Локк Коул
  3. ДОМЕН Сабин Фигаро
  4. ДОМЕН Cyan Garamonde

Отсюда я могу создать свой фильтр с буквами: C L R S. Итак, мой вопрос в том, как мне создать отдельный запрос Linq, который возвращает результаты на основе первой буквы?

Комментарии:

1. Это не запрос LINQ к sharepoint. Вы просто извлекаете все элементы списка в память и выполняете всю эту фильтрацию на стороне приложения. Сказав это, я совершенно уверен, что невозможно написать этот запрос на CAML, поэтому у вас не будет никаких средств для выполнения чего-либо еще. Тем не менее, вы должны понимать, что на самом деле вы не выполняете никакой фильтрации БД. Одна вещь, которую вы можете сделать, это установить ViewFields только для извлечения нужных вам столбцов.

2. Согласен, CAML просто не подойдет. Настройка полей просмотра поможет уменьшить нагрузку, но как насчет возврата РАЗЛИЧНЫХ результатов?

3. Это перестает быть проблемой SharePoint. Извлеките имя пользователя, и тогда оно станет просто получением отдельных первых букв имени пользователя с учетом последовательности строк.

Ответ №1:

Итак, я понял это:

  1. Использование /14/bin/SPMetal.exe чтобы экспортировать URL-адрес сайта в файл класса DataContext
  2. Импортируйте этот файл класса *.cs в свой проект (найдите в /14/bin/)
  3. Добавление ссылок
  4. Запустите Linq для SP, используя ваш DataContext
  5. Запрос на все, что душе угодно

Вот пример табличных данных:

  1. ДОМЕН Терра Бранфорд
  2. ДОМЕН Локк Коул
  3. ДОМЕН Сабин Фигаро
  4. ДОМЕН Сетцер Габбиани
  5. ДОМЕН Cyan Garamonde
  6. ДОМЕН Celes Chere
  7. ДОМЕН Cid Маркес

Вот код фильтрации данных:

 using System.Linq;
using Microsoft.SharePoint.Linq;

MyDataContext dc = new MyDataContext("http://localhost");
var varUserActivity = (from item in dc.UserActivityList
                       orderby item.UsernameName.ToString().Substring(item.UsernameName.ToString().IndexOf('#')   1, 1).ToLower().Replace("domain\", "") ascending
                       select new { letter = item.UsernameName.ToString().Substring(item.UsernameName.ToString().IndexOf('#')   1, 1).ToLower().Replace("domain\", "") }).Distinct();

foreach (var uaitem in varUserActivity)
{
    this.Controls.Add(new LiteralControl(uaitem.letter   "<br>"));
}
 

Итак, что происходит в этом коде, так это то, что он запрашивает один столбец people в списке, удаляет домен, возвращает первую букву имени учетной записи, сортирует по возрастанию и возвращает разные буквы. Таким образом, результат с приведенными выше табличными данными покажет:

  1. c
  2. l
  3. s
  4. t

Это идеально подходит для создания алфавитного фильтра. Я не совсем уверен, выполняет ли он реальную фильтрацию данных или нет, но он, несомненно, превосходит выполнение 26 разных запросов по буквам.