使用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 需要列出我的工程文件目录结构如下: