使用Silverlight + DomainService进行开发时我们可以在Silverlight项目中创建一个BLL层用于Silverlight调用如下图所示
要完成数据查询功能在Sliverlight项目中做了这么几项工作
1.定义查询处理委托
public delegate void SelectOneHander<T>(T data);
2.编写BLL代码
我这里写了一个DB类用于处理DomainService对象,代码如
public class DB { private static DomainService1 _db; public static DomainService1 db { get { if (_db == null) _db = new DomainService1(); return _db; } } }
单数查询功能,例如前面文章中的分页查询中的总记录条数就用此方式进行查询的,要完成这种只查询一条记录的需要对原有的DomainService进行扩充
修改原有的DomainServie改为局部类,将如下代码改为:
public lass DomainService1 : LinqToEntitiesDomainService<MyBookShopEntities>
修改为:
public partial class DomainService1 : LinqToEntitiesDomainService<MyBookShopEntities>
另外创建一个DomainServiceEx的文件,编写DomainService1的扩展类如下:
public partial class DomainService1 { public IQueryable<Books> GetBooksByPage(int pageIndex,int pageSize) { return this.ObjectContext.Books.OrderBy(b=>b.Id).Skip(pageIndex * pageSize).Take(pageSize); } public int GetBookCount() { return this.ObjectContext.Books.OrderBy(b => b.Id).Count(); } }
这样就可以在Silverlight的UserBLL中调用这两个数据方法:
public class BookBLL { public static void FindAllByPage(int pageIndex,int pageSize,SelectHander<Books> sh) { var db=DB.db; var m= db.Load<Books>(db.GetBooksByPageQuery(pageIndex,pageSize)); m.Completed += (a,b) => { sh(m.Entities); }; } public static void GetBookCount(SelectOneHander<int> sh) { var db = DB.db; var m = db.GetBookCount(); m.Completed += (a, b) => { sh(m.Value); }; } }
3.在Silverlight的表示层就可以调用BookBLL来完成分页代码
//加载时绑定数据 private void LayoutRoot_Loaded(object sender, RoutedEventArgs e) { //第一页数据 BookBLL.FindAllByPage(0, 10, datas => { booksDataGrid.ItemsSource = datas; }); //获取页码 BookBLL.GetBookCount(data => { hahaPager1.Pi.RecordCount = data; hahaPager1.Pi.PageSize = 10; hahaPager1.Pi.Compute(); hahaPager1.Render(); }); } //页码改变时重新获取下一页数据 private void hahaPager1_PageIndexChanged(object sender, EventArgs e) { var pi=hahaPager1.Pi; BookBLL.FindAllByPage(pi.PageIndex, pi.PageSize, datas => { booksDataGrid.ItemsSource = datas; }); }
效果就和前面的文章一样了:
有网友Sky_Dhx 需要列出我的工程文件目录结构如下: