Работа с DataGrid в Silverlight с использованием ADO.NET и WCF

ОГЛАВЛЕНИЕ

Ключевым аспектом любого бизнес-приложения является возможность переноса информации из базы данных в пользовательский интерфейс. Хотя существует множество вопросов, которые необходимо обсудить, данная статья пройдет через самый короткий путь, чтобы продемонстрировать при помощи простейшей технологии один из способов переноса информации из одного места в другое.

Цели

Непосредственной целью данной статьи будет реализация извлечения информации из базы данных SQLServer, при помощи оператора Where и предоставления ее посредством веб-сервиса с использованием WCF-SOAP. Информация будет затем использована приложением Silverlight , которое отобразит ее в элементе управления DataGrid. В общем, цель заключается в демонстрации взаимодействия данных технологий для упрощения получения информации.

Шаг 1 – База данных

Для начала вам понадобится база данных AdventureWorks, которую вы можете найти на Codeplex. Будьте внимательны при загрузке, так как вам будет необходима соответствующая версия (2005 или 2008) в зависимости от версии имеющегося SqlServer. Если у вас есть в наличии только SqlExpress и Visual Studio, то одним из способов создания соединения данных с файлом является открытие окна Server Explorer - щелкнув правой кнопкой мыши по Data Connection и выбрав пункт “Add Connection” (Добавить соединение). Затем нажмите на Data Source->Change и выберите пункт SQL Server Database File (Файл базы данных SQL Server).

В диалоговом окне добавления соединения (Add Connection) щелкните по кнопке Browse и выберите файл Adventureworks.mdf (обычно установлен в : C:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Data).  Проверьте свое соединение при необходимости.

Шаг 2 – Создание нового проекта

Создайте новый проект Silverlight и назовите его EntitiesWebSvcGrid, при этом примите стандартную опцию типа проекта в качестве веб-приложения (ASP.NET Web Application). Вы можете называть свои проекты и объекты так, как вы решите нужным, но мы будем использовать определенные названия для удобства в объяснении.

Рисунок 9-1. Веб-проект

Visual Studio создаст одно решение с двумя проектами:

  • EntitiesSvcGrid  (проект Silverlight )
  • EntitiesSvcGrid.Web (веб-проект)

Второй проект будет содержать модель ADO.NET и веб-сервис, в то время как первый будет содержать DataGrid из Silverlight.

Шаг 3 – Добавление модели ADO.NET

Чтобы создать модель данных (Data Model) щелкните правой кнопкой мыши по веб-проекту и выберите пункт Add New. После выберите Ado.Net Entity Data Model,назовите ее EmployeeDataModel.edmx и нажмите кнопку добавления (Add).

В следующем диалоговом окне щелкните по кнопке "Generate from Database"– это создаст модель данных, сохранив вам море времени. Следующее диалоговое окно попросит вас выбрать желаемый тип соединения,

Рисунок 9-2. Выбор источника данных

Как только соединение будет осуществлено и будет получена структура данных, вас попросят выбрать таблицы, представления и хранимые процедуры, которые вы хотели бы включить в вашу модель. Для данного примера мы выберем всего одну таблицу для простоты: Employee

Рисунок 9-3. Выбор объектов данных

При нажатии на кнопку Finish ваша модель данных будет создана. Уделите несколько минут на изучение результата. Обратите внимание на то, что может появиться окно Visual Studio названное Mapping Details. Откройте его и пусть оно занимает пол экрана - его также стоит исследовать.

Рисунок 9-4. Сопоставление деталей

 

Шаг 4 Создание веб-сервиса

Создав модель данных, мы можем приступить к созданию  веб-сервиса для того, чтобы информация была доступна приложению Silverlight, работающему со стороны клиента. У нас есть несколько вариантов выполнения задуманного, но сейчас мы будем  использовать модель WCF/SOAP посредством шаблона Silverlight-aware. Заново щелкните правой кнопкой мыши по веб-проекту и выберите Add… New Item, на этот раз выбрав Silverlight-Enabled WCF Service. Назовите новый сервис EmployeeWebService и нажмите OK. Откройте EmployeeWebService.svc.cs, где вы найдете метод-пустышку DoWork, который вы измените для того, чтобы он получал список сотрудников.

[ServiceContract( Namespace = "" )]
[AspNetCompatibilityRequirements( RequirementsMode =
   AspNetCompatibilityRequirementsMode.Allowed )]
public class EmployeeWebService
{
    [OperationContract]
    public  List<Employee> GetEmployees()
    {
      AdventureWorks_DataEntities ds =
         new AdventureWorks.DataEntities();
       return ds.Employee.Where( emp => emp.SalariedFlag == true ).ToList();
    }
}

Данный код стоит исследовать. Первая строка метода GetEmployees создает экземпляр DataEntity, который мы определили ранее. Вторая строка запрашивает экземпляр данных об объектах Employee, но поскольку их слишком  много, то мы добавим оператор where, использующий лямбда-выражение для того, чтобы уменьшить, возвращается набор и затем вызывает ToList() по отношению к полученному списку, при этом эффективно конвертируя результат в List<Employee>.

Использование лямбда-выражения в операторе Where

Используемое выражение для сокращения списка сотрудников является лямбда-выражением

emp => emp.SalariedFlag == true

Существует несколько способов интерпретации данного выражения, но простым объяснением будет “пусть emp - это все объекты сотрудников, чье свойство SalariedFlag оценивается как true.”