Các phương thức dùng để truy vấn dữ liệu từ dữ liệu nguồn đôi khi được gọi là các query method. Trong WCF RIA Services, các query method phải được xác định bằng cách mà framework xem chúng là query methods. Ngoài ra , các truy vấn luôn trả về một single entity được xác định khác với các truy vấn trả về nhiều giá trị. Để có thêm thông tin về query method, hãy xem Domain Services.
Khi bạn tạo mới một lớp domain service và xác định các entity trong hộp thoại Add New Domain Service Class , thì RIA Services framework sẽ tự động tạo query method đơn giản cho từng entity được trình bày bởi service. Query method nhận tất cả các dòng của entity. Bài viết này mô tả làm cách nào để thêm một query methods mới, thực thi nhiều truy vấn sàng lọc phức tạp hơn bằng một giá trị tham số. Bài này cũng mô tả làm cách nào thêm một truy vấn trả về một giá trị entity và trả về một tập các entity.
Visual Studio 2010
Silverlight 4
WCF RIA Services for Visual Studio 2010
AdventureWorkLT sample database
Một RIA Services project đã xuất dữ liệu từ bảng Customer của cơ sở dữ liệu đơn giản AdventureWorksLT như là trong bài viết trước Walkthrough: Creating a RIA Services Solution.
Mở solution đã lấy dữ liệu từ bảng Customer trong bài trước.
Để có thêm thông tin, hãy xem tại liên kết này Walkthrough: Creating a RIA Services Solution.
Trong server project, hãy mở lớp domain service truy xuất dữ liệu từ bảng Customer.
Tên của lớp domain service đã liệt kê trong phần yêu cầu là CustomerDomainService.
Thêm một query method nhận một đối số kiểu integer và trả về một Customer entity có customer ID tương ứng.
Nếu một phương thức trả về một single entity bao gồm thuộc tính QueryAttribute, thì bạn phải thiết lập thuộc tính IsComposable thành false. Người dùng không thể thao tác thêm các truy vấn từ client. Nếu query method phù hợp với cấu trúc của một câu truy vấn, bạn không cần áp dụng thuộc tính QueryAttribute . Giá trị trả về phải là một instance duy nhất của một đối tượng entity.
[Query(IsComposable=false)] public Customer GetCustomersByID(int customerID) { return this.ObjectContext.Customers.SingleOrDefault( c => c.CustomerID == customerID); }
Trong domain service, thêm một query method có đầu vào là một tham số kiểu string và trả về bất kì customers nào có tên bắt đầu là một kí tự.
Phương thức này có thể trả về một đối tượng IQueryable<> bởi vì người dùng có thể muốn cung cấp thêm các thao tác truy vấn từ client.
public IQueryable<Customer> GetCustomersByLastNameLetter( string startingLastNameLetter) { return this.ObjectContext.Customers.Where (c => c.LastName.StartsWith( startingLastNameLetter) == true); }
Trong client project, hãy mở MainPage.xaml.
Thêm hai TextBox controls và hai Button controls để người dùng có thể lọc ra các customer bằng ID hay bằng kí tự đầu tiên của tên.
Phần mã XAML sau trình bày một layout hoàn chỉnh với DataGrid đã có .
<UserControl xmlns:data="clr-namespace:System.Windows.Controls; assembly=System.Windows.Controls.Data" x:Class="RIAServicesExample.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> <Grid.ColumnDefinitions> <ColumnDefinition></ColumnDefinition> <ColumnDefinition></ColumnDefinition> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="25"></RowDefinition> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="0"> <TextBlock Text="search by id: " ></TextBlock> <TextBox Name="IDValue" Width="50" ></TextBox> <Button Name="IDButton" Click="IDButton_Click" Content="Submit"> </Button> </StackPanel> <StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="1"> <TextBlock Text="search by name: "></TextBlock> <TextBox Name="LetterValue" Width="30"></TextBox> <Button Name="LetterButton" Click="LetterButton_Click" Content="Submit"></Button> </StackPanel> <data:DataGrid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Name="CustomerGrid"> </data:DataGrid> </Grid> </UserControl>
Mở tập tin code phía sau của trang MainPage.xaml (MainPage.xaml.cs hay MainPage.xaml.vb).
Thêm mã vào để nhận kết quả truy vấn dựa trên những gì mà người dùng nhập vào
using System; using System.Windows; using System.Windows.Controls; using RIAServicesExample.Web; using System.ServiceModel.DomainServices.Client; namespace RIAServicesExample { public partial class MainPage : UserControl { private CustomerDomainContext _customerContext = new CustomerDomainContext(); public MainPage() { InitializeComponent(); } private void LetterButton_Click(object sender, RoutedEventArgs e) { IDButton.IsEnabled = false; LetterButton.IsEnabled = false; LoadOperation<Customer> loadOp = this._customerContext.Load( this._customerContext.GetCustomersByLastNameLetterQuery( LetterValue.Text), CustomerLoadedCallback, null); CustomerGrid.ItemsSource = loadOp.Entities; } private void IDButton_Click(object sender, RoutedEventArgs e) { IDButton.IsEnabled = false; LetterButton.IsEnabled = false; LoadOperation<Customer> loadOp = this._customerContext.Load( this._customerContext.GetCustomersByIDQuery( int.Parse(IDValue.Text)), CustomerLoadedCallback, null); CustomerGrid.ItemsSource = loadOp.Entities; } void CustomerLoadedCallback( LoadOperation<Customer> loadOperation) { IDButton.IsEnabled = true; LetterButton.IsEnabled = true; } } }
Chạy ứng dụng.
Và đây là hình mô tả danh sách các customers được lọc ra theo tên.