在上一章中,虽然只添加了一个方法,但是在LINQ下的三层架构已经成型了。这章之中我们将在中间层添加更多的方法,包括带参数的查询,以及插入 更新,删除操作。
按部就班的做
一、带参查询:
1打开Productbll.cs文件,在上一章的GetProduct方法之后添加一个GetProductByProductID方法,代码如下:
public IQueryable GetProductByProductID( int productID)
{
var product = from p in db.Products
where p.ProductID == productID
select p;
return product;
}
2简单的代码解释:
1) 首先是一段声明,告诉自动识别系统该方法是查询方法。
2) 注意我们使用了IQueryable类型,该类型是返回值的类型,可以直接作为Datasource使用。
3) 然后是LINQ语句,意为从db中的Products表(已经对象化)选取ProductID=参数productID的记录
4) 最后返回product(IQueryable类型)
3新建一个页面,插入一个GridView,一个TextBox和一个Botton,Botton的Text属性改为“输入产品ID查询结果”。
4双击Botton,在按钮事件中输入如下代码:
GridView1.DataBind();
5运行该页面,在文本框中输入一个存在的ProductID,然后单击Botton按钮,将显示对应ProductID的产品的记录。
二、插入一条记录
1在GetProductByProductID方法后面新增一个方法AddProduct,代码如下:
public bool AddProduct( string productName, int ? supplierID, int ? categoryID, string quantityPerUnit, decimal ? unitPrice, short ? unitsInStock, short ? unitsOnOrder, short ? reorderLevel, bool discontinued)
{
Product nproduct = new Product();
nproduct.ProductName = productName;
nproduct.SupplierID = supplierID;
nproduct.CategoryID = categoryID;
nproduct.QuantityPerUnit = quantityPerUnit;
nproduct.UnitPrice = unitPrice;
nproduct.UnitsInStock = unitsInStock;
nproduct.UnitsOnOrder = unitsOnOrder;
nproduct.ReorderLevel = reorderLevel;
nproduct.Discontinued = discontinued;
db.Products.InsertOnSubmit(nproduct);
db.SubmitChanges();
return true;
}
2简单的代码解释:
1) 首先是一段声明,告诉自动识别系统该方法是插入方法。
2) 创建了一个Product的实例 nproduct(映射到Product表的一行)
3) 将nproduct的属性依次赋值
4) 确认一个对db.Products的插入操作,插入记录为nproduct
5) 通过SubmitChanges()方法将对象中改变的数据存入数据库
3在刚才的查询页面中再添加一个Botton,Text属性改为“新增一条记录”。
4双击该按钮,在事件中添加如下代码:
5运行上一章中的查询所有产品记录的页面,可以在最底下发现一条新纪录
三、更新一条记录
1在AddProduct方法后加入一条新方法,UPProduct,代码如下:
public bool UPProduct( int productID, string productname)
{
Product pro = db.Products.Single(b => b.ProductID == productID);
pro.ProductName = productname;
db.SubmitChanges();
return true;
}
2简单的代码解释:
1) 首先是一段声明,告诉自动识别系统该方法是更新方法。
2) 创建了一个Product的实例 pro(映射到Product表的某一行)
3) 为了确
定是哪一行的记录,我们使用了一个LAMBDA表达式,该表达式意为:Product表中字段ProductID与参数productID相等的一行。表达式为:b => b.ProductID == productID
4) 为了简单起见,我们单独修改了ProductName这一个字段,将参数productname赋值给它
5) 通过SubmitChanges()方法将对象中改变的数据存入数据库
3在刚才的页面中插入一个新按钮,Text属性为“修改指定ID的记录”
4双击按钮,在事件中输入如下代码:
5我们直接传入参数NEW作为修改记录的Productname。
6运行该页面,任意输入一个已有的ID,然后点击该按钮,再从上一章页面中查看所有记录,观察到刚才输入ID的那条记录的Productname已经变成了NEW。
四、删除一条记录
1在UPProduct方法之后添加新方法DeletProduct,代码如下:
public bool DeletProduct( int productID)
{
try
{
Product pro = db.Products.Single(b => b.ProductID == productID);
db.Products.DeleteOnSubmit(pro);
db.SubmitChanges();
}
catch
{
}
return true;
}
2简单的代码解释:
1) 首先是一段声明,告诉自动识别系统该方法是删除方法。
2) 创建了一个Product的实例 pro(映射到Product表的某一行)
3) 为了确定是哪一行的记录,我们使用了一个LAMBDA表达式,该表达式意为:Product表中字段ProductID与参数productID相等的一行。表达式为:b => b.ProductID == productID
4) 确认一个对db.Products的删除操作,删除记录pro
5) 通过SubmitChanges()方法将对象中改变的数据存入数据库
6) 由于存在外键的约束,我们不能删除原表中的一条记录,因此我们使用try尝试删除,如果失败则终止,我们可以删除一条我们新增的记录。
3在刚才的页面中添加一个新Botton,Text属性为“删除指定ID的记录”
4双击该按钮,在事件中加入如下代码:
5运行该页面,输入一个非原有ID(最好是新增一个记录,然后输入该记录的ID),点击该按钮。
6打开上一章的页面查看所有记录,观察到新增的记录已经被删除。
它是如何工作的?
我们为中间层的Productbll类新增了4个方法。分别为:
l GetProductByProductID
l AddProduct
l UPProduct
l DeletProduct
这些方法都是直接操作于对象化的数据,除了查询操作可以直接使用LINQ语句获取对象内容,任何其他有关于要对数据库进行修改的方法都需要db.SubmitChanges()方法进行确认,因为在确认之前,数据仅仅在DataContext实例中(应该是内存中)被修改,只有在确认之后,才会将改变应用到数据库中。之后我们在表示层中通过调用这些方法,来完成我们所需要的操作。
小结:
这一章中我们在中间层中实现了插入,更新和删除的方法。因为在中间层中只有db.SubmitChanges()操作是数据访问,而其他操作都是逻辑上的(非实体的)访问与修改,所以我们没有必要把db.SubmitChanges()方法单独去放在另外一层之中。
我们还用到了形如(b => b.ProductID == productID)这样的LAMBDA表达式。Lambda表达式的语法非常简洁。语法如下:(参数列表) => 表达式或者语句块。参数个数:可以有多个参数,一个参数,或者无参数。具体的用法可以查看更为细致的基础教程,我们这里以结构和方法为主。下一章中我们将在中间层使用LINQ语句查询符合条件的记录的汇总情况(如:总价、平均价格)。以前这些内容我们可能会将这些记录先传到表示层中,然后再表示层中通过操作DataTable等方法去处理这类问题,因为在中间层我们无法获得相关数据内容以及进行遍历。而使用LINQ将会使得这些工作变得简单。