Работа с 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.”