Truy Vấn Dữ Liệu, C# — Dịch Vụ Wcf Ria Là Gì

[ad_1]

Hey there! Thanks for dropping by ttmn.mobi! Take a look around and grab the RSS feed to stay updated. See you around!

Tổng quan

Trong phần trước, tôi đã giới thiệu sơ qua về WCF RIA Services thông qua một ví dụ tựa “Hello World”. Nó dường như quá đơn giản và không thể sử dụng trong ứng dụng thực tế. Đối với ứng dụng thực tế, bạn cần phải biết cách làm thế nào để tùy chỉnh services và sử dụng nó ở client như thế nào. Trong bài viết này, tôi sẽ đi sâu hơn một chút vào quá trình truy vấn dữ liệu từ client. Tôi cũng sẽ lướt qua về quy ước đặt tên phương thức được định nghĩa trong domain service, cũng như cách làm thế nào để làm điều đó sử dụng attribute thay vì theo đúng quy ước. Tôi cũng sẽ hướng dẫn cách dùng các truy vấn từ client. Cuối cùng, tôi sẽ nói về cách sử dụng dữ liệu từ các nguồn dữ liệu khác Entity Framework.

Bạn đang xem: Wcf ria services part 2: truy vấn dữ liệu

Để bắt đầu bạn nên sử dụng kết quả đã làm được từ phần trước. Bạn có thể download tại đây (khác).

Download code hoàn chỉnh của bài viết này tại đây (khác).

Bước 1: Thêm tham số cho câu truy vấn

Trong bài viết trước, sau khi được tạo xong, trong domain service có một phương thức truy vấn như thế này:

1: public IQueryable GetTasks() 2: { 3: return this.ObjectContext.Tasks; 4: }
Câu truy vấn này trả về tất cả các Task trong database dưới dạng một IQueryable. Nếu bạn muốn có các truy vấn cụ thể hơn chứ không phải trả về tất cả các dòng, bạn có thể thêm các phương thức truy vấn cụ thể vào domain service và nó sẽ được tự sinh ra ở client side. Bạn cũng có thể chọn kiểu trả về làIEnumerable, nhưng nếu các provider bên dưới (Entity Framework hoặc LINQ to SQL) trả vềIQueryable, bạn cũng nên trả về kiểu IQueryable thay vì chuyển kiểu.

Một trường hợp thường gặp là ứng dụng của bạn cho phép người dùng lấy các Task trong một khoảng thời gian. Để hỗ trợ điều đó, bạn thêm phương thức sau vào domain service

public IQueryable GetTasksByStartDate( DateTime lowerDateTimeInclusive, DateTime upperDateTimeInclusive){ return this.ObjectContext.Tasks.Where( t => t.StartDate >= lowerDateTimeInclusive && t.StartDate

Bước 2: Thêm giao diện để thực hiện các truy vấn

Để gọi các truy vấn tìm kiếm thay vì gọi GetTasks lúc Page_Load, bạn cần chỉnh sửa giao diện một tí. Mở trang MainPage.xaml, giảm kích thước của DataGrid để chừa chỗ trống thêm vào hai TextBox và một Button như dưới đây

*

Đặt tên cho TextBox thứ nhất là lowerDate, TextBox thứ hai là upperDate và Button là searchButton. Nhấp đúp vào button để thêm hàm xử lý sự kiện.

Bước 3: Thực thi câu truy vấn từ client thông qua DomainContext

Như đã giới thiệu trong phần 1, DomainContext là bản sao của DomainService được tự sinh ra ở client side. Trong ứng dụng này, tương ứng với domain service TasksDomainService ở server side, domain context ở client side là TasksDomainContext. Nó cung cấp khả năng gọi bất đồng bộ và gửi các thay đổi trên entity (được thực hiện ở client) đến server side. DomainContext thực sự là bộ não của WCF RIA Service ở phía client. Bất cứ khi nào bạn thực thi truy vấn để lấy các entity từ server thông qua domain context, nó đều giữ lại liên kết đến các entity đó và cả những thay đổi trên các entity đó. Vì vậy, nếu bạn chỉnh sửa những đối tượng đó, nó biết có sự thay đổi và có thể gửi ngược lại server khi bạn quyết định cập nhật những thay đổi đó. Tôi sẽ nói nhiều hơn trong bài viết kế tiếp. Còn trong bài viết này, chúng ta tập trung vào việc lấy dữ liệu.

Thêm đoạn code sau vào hàm xử lý sự kiện button searchButton

private void searchButton_Click(object sender, RoutedEventArgs e){ DateTime lowerDateVal; DateTime upperDateVal; GetDates(out lowerDateVal, out upperDateVal); TasksDomainContext context = new TasksDomainContext(); taskDataGrid.ItemsSource = context.Tasks; EntityQuery query = context.GetTasksByStartDateQuery(lowerDateVal, upperDateVal); LoadOperation loadOp = context.Load(query);}
Đoạn code quan trọng ở đây là bốn dòng cuối. Để gọi đến server side, bạn cần một instance của domain context. Trong ứng dụng thực tế, bạn cần giữ domain context lại vì đó là nơi lưu các thay đổi trên đối tượng để cập nhật. Thông thường, bạn sẽ khai báo nó trong view model hoặc phạm vi ứng dụng. Tôi sẽ nói rõ hơn trong phần 4 của loạt bài này.

Domain context có property là một collection các entity được trả về bởi các phương thức truy vấn ở domain service. Trong ví dụ này, domain service chỉ kết xuất một collection các Task. Để ý rằng dòng lệnh gán ItemsSource của DataGrid bằng context.Tasks trước khi gọi bất kỳ truy vấn nào. Vì khi bạn truy vấn thông qua domain context, câu truy vấn được gọi bất đồng bộ và sẽ thay thế nội dung của collection ngay khi nhận được dữ liệu trả về từ server. Collection này (context.Tasks) hiện thực eventINotifyCollectionChanged và sẽ raise event để DataGrid tự cập nhật lại khi nhận được event này.

Dòng lệnh kế tiếp lấy một EntityQuery từ domain context với các tham số truyền vào tương ứng. Đó chỉ mới là thiết lập những gì bạn muốn thực hiện, nó chưa thực sự gọi đến server. Cuối cùng, ta lấy một LoadOperation từ domain context bằng cách gọi phương thức Load. Đây là lúc thực hiện lời gọi đến server, nó sẽ chạy trên background thread và tự cập nhật khi nhận được kết quả trả về từ server.

Đây tương tự những gì xảy ra với DomainDataSource được sử dụng trong XAML ở bài viết trước.

Hàm GetDates ở trên chỉ lấy ngày từ các TextBox và kiểm tra tính hợp lệ.

Xem thêm: Tổng Hợp Các Cặp Từ Đồng Nghĩa Tiếng Anh Là Gì, Đồng Nghĩa In English

Bước 4: Thêm câu truy vấn trả về một entity duy nhất

Để trả về một entity thay vì một collection bạn chỉ cần định nghĩa nó trên domain service. Một phương thức truy vấn tương ứng sẽ được tạo trong domain context sau khi biên dịch.

public Task GetTask(int taskId){ return this.ObjectContext.Tasks.FirstOrDefault(t => t.TaskId == taskId);}

Quy ước đặt tên phương thức

Đây là một xu hướng mới nổi trong phát triển .NET – làm giảm lượng cấu hình trong code dựa vào một số quy ước đặt tên. Có một số tiền tố WCF RIA Services nhận biết được với các phương thức cập nhật, thêm mới, xóa như UpdateTask, InsertTask, DeleteTask (và các tiền tố khác như Change, Modify, Add, Create, Remove).

Bạn cũng có thể cấu hình bằng cách sử dụng các attribute. Ví dụ với các câu truy vấn, bạn sử dụng attribute . Những phương thức có kiểu trả về là IQueryableIEnumerable hoặc một entity cũng được xác định rõ ràng là một phương thức truy vấn. Một trong những lợi thế của việc sử dụng atrribute là nó hỗ trợ thêm một vài thứ như số lượng phần tử tối đa trong kết quả trả về.

Bạn có thể tham khảo thêm một số quy ước đặt tên tại đây.

Tùy chỉnh Domain Service

Bạn không muốn sử dụng Entity Framework? Một lựa chọn khác là LINQ to SQL. Theo ý kiến cá nhân, tôi đề nghị bạn nên sử dụng Entity Framework nếu bạn bắt đầu một dự án mới. Nó thực sự có khả năng và có vẻ sẽ là phương pháp truy xuất dữ liệu từ .NET tốt được sử dụng lâu dài. LINQ to SQL cũng được hỗ trợ thông qua WCF RIA Services Toolkit nếu bạn thực sự muốn sử dụng nó.

Nhưng rất nhiều người đang sử dụng những chiến lược truy xuất dữ liệu khác (vd: nHibernate, SubSonic…) và các nguồn dữ liệu khác (vd: Oracle, MySQL…). Bạn có thể dễ dàng sử dụng chúng với WCF RIA Services miễn là bạn định nghĩa các đối tượng dữ liệu bạn muốn truyền qua là các entity đơn giản. Nó được gọi là POCO (Plain Old CLR Objects) domain services.

Để làm điều này, bạn chỉ cần kế thừa domain service của bạn trực tiếp từ class DomainService, thay vì kế thừa từ LinqToEntitiesDomainService. Trong cửa sổ Add New Domain Service Class (Add > New Item > Domain Data Service) chỉ cần chọn “empty domain service class” trong Available DataContext/ObjectContext. Sau đó tự định nghĩa các entity, trả về IEnumerable nếu các nguồn dữ liệu bên dưới không hỗ trợ IQueryable và làm bất cứ điều gì bạn cần trong các phương thức trên nguồn dữ liệu tương ứng.

*

Sau đó, bạn định nghĩa service trên nguồn dữ liệu và đối tượng đang làm việc. Các entity cần phải có các property có kiểu là các entity khác hoặc các kiểu được hỗ trợ sẵn bởi .NET Framework.

Entity phải có một property là duy nhất giữa các instance của nó. Nó thường có kiểu là int hoặc Guid. Bạn phải chỉ rõ property đó bằng attribute .

Đoạn code dưới đây là ví dụ đơn giản về một domain service và các entity

public class Foo{ public int FooId { get; set; } public string Name { get; set; }}public class MyPOCODomainService : DomainService{ public IEnumerable GetFoos() { return new List { new Foo { FooId = 42, Name = “Fred” } }; }}
Ngoài attribute , nếu trong entity của bạn có property có kiểu là entity khác, bạn cần phải định nghĩa thêm property với các attribute  để WCF RIA Service có thể lấy đầy đủ thông tin của entity và các property của nó (là một entity khác). Xem MSDN để biết thêm thông tin các attribute này.

Tóm tắt

Trong bài viết này, bạn đã biết được các câu truy vấn trong WCF RIA Services hoạt động như thế nào. Bạn cũng biết một cách lập trình để truy vấn dữ liệu và bind kết quả vào control. Bạn biết cách định nghĩa thêm những phương thức mới và quy ước đặt tên các phương thức truy vấn trong domain service và biết cách kết xuất POCO domain service. Trong bài viết tiếp theo, tôi sẽ hướng dẫn làm thế nào để những thay đổi trên client được cập nhật đến server.

[ad_2]

Related Posts

Trò chơi trang trí nhà cửa

[ad_1] Xếp nhà là game 4399, là trò chơi trang trí nhà cửa với mô hình ngôi nhà cực đẹp cho các bạn nhỏ yêu thích trang…

Trò chơi Robo trái cây

[ad_1] Robo trái cây thuộc dòng game A10, tham gia vào cuộc chiến bắn tọa độ giữa táo ngố và những tên tinh nghịch cực kỳ vui…

Trò chơi bé đi siêu thị

[ad_1] Đi siêu thị mua sắm thuộc dòng game 4399, một trò chơi giúp các bạn nhỏ đi siêu thị và mua những món đồ cần thiết…

Game đại chiến voi rừng: Trò chơi thả voi

[ad_1] Đại chiến voi rừng là dòng game chiến thuật, hay các bạn nhỏ còn được biết đến với cái tên gọi là trò chơi thả voi…

Trò chăm sóc thú cưng

[ad_1] Bệnh viện thú cưng là dòng game 24h, khi mà chúng ta sẽ hóa thân thành một bác sĩ chuyên chăm sóc những chú chó, mèo……

Game Commando 2: Trò chơi Commando 2

[ad_1] Commando 2 là dòng game chiến tranh, một thể loại game mà anh em ta dường như đã quá quen thuộc với anh em game thủ…

Leave a Reply