阿立部落格

致力于ASP. NET的研究
posts - 12, comments - 105, trackbacks - 22, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

在上一章中,虽然只添加了一个方法,但是在LINQ下的三层架构已经成型了。这章之中我们将在中间层添加更多的方法,包括带参数的查询,以及插入 更新,删除操作。

按部就班的做

一、带参查询:

1打开Productbll.cs文件,在上一章的GetProduct方法之后添加一个GetProductByProductID方法,代码如下:

[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]

    
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和一个BottonBottonText属性改为“输入产品ID查询结果”。

4双击Botton,在按钮事件中输入如下代码:

 

GridView1.DataSource = product.GetProductByProductID(Convert.ToInt16(TextBox1.Text));

        GridView1.DataBind();

 

5运行该页面,在文本框中输入一个存在的ProductID,然后单击Botton按钮,将显示对应ProductID的产品的记录。

二、插入一条记录

1GetProductByProductID方法后面新增一个方法AddProduct,代码如下:

[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, true)]

    
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在刚才的查询页面中再添加一个BottonText属性改为“新增一条记录”。

4双击该按钮,在事件中添加如下代码: 

product.AddProduct("Sunli'Tea",1,1,"cup",20m,2,1,1,false);

5运行上一章中的查询所有产品记录的页面,可以在最底下发现一条新纪录

三、更新一条记录

1AddProduct方法后加入一条新方法,UPProduct,代码如下:

[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, true)]

    
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双击按钮,在事件中输入如下代码:

product.UPProduct(Convert.ToInt16(TextBox1.Text),"NEW");

5我们直接传入参数NEW作为修改记录的Productname

6运行该页面,任意输入一个已有的ID,然后点击该按钮,再从上一章页面中查看所有记录,观察到刚才输入ID的那条记录的Productname已经变成了NEW

四、删除一条记录

1UPProduct方法之后添加新方法DeletProduct,代码如下:

[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Delete, true)]

    
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在刚才的页面中添加一个新BottonText属性为“删除指定ID的记录”

4双击该按钮,在事件中加入如下代码:

product.DeletProduct(Convert.ToInt16(TextBox1.Text));

5运行该页面,输入一个非原有ID(最好是新增一个记录,然后输入该记录的ID),点击该按钮。

6打开上一章的页面查看所有记录,观察到新增的记录已经被删除。

它是如何工作的?

我们为中间层的Productbll类新增了4个方法。分别为:

GetProductByProductID

AddProduct

UPProduct

DeletProduct

这些方法都是直接操作于对象化的数据,除了查询操作可以直接使用LINQ语句获取对象内容,任何其他有关于要对数据库进行修改的方法都需要db.SubmitChanges()方法进行确认,因为在确认之前,数据仅仅在DataContext实例中(应该是内存中)被修改,只有在确认之后,才会将改变应用到数据库中。之后我们在表示层中通过调用这些方法,来完成我们所需要的操作。

小结:

这一章中我们在中间层中实现了插入,更新和删除的方法。因为在中间层中只有db.SubmitChanges()操作是数据访问,而其他操作都是逻辑上的(非实体的)访问与修改,所以我们没有必要把db.SubmitChanges()方法单独去放在另外一层之中。

我们还用到了形如(b => b.ProductID == productID)这样的LAMBDA表达式。Lambda表达式的语法非常简洁。语法如下:(参数列表) => 表达式或者语句块。参数个数:可以有多个参数,一个参数,或者无参数。具体的用法可以查看更为细致的基础教程,我们这里以结构和方法为主。下一章中我们将在中间层使用LINQ语句查询符合条件的记录的汇总情况(如:总价、平均价格)。以前这些内容我们可能会将这些记录先传到表示层中,然后再表示层中通过操作DataTable等方法去处理这类问题,因为在中间层我们无法获得相关数据内容以及进行遍历。而使用LINQ将会使得这些工作变得简单。

Tag标签: ASP.NET,.NET,分层,LINQ

Feedback

#1楼 [楼主]   回复  引用  查看    

2008-04-04 21:37 by NafLian      
http://www.cnblogs.com/ch00694534/archive/2008/04/02/1134975.html
这是文章的目录

#2楼    回复  引用    

2008-04-04 22:17 by lauralxj [未注册用户]
这个文章越来越有意思了,希望接下来更深入一下,以及关系型数据庫的实际操作中的问题:并发 约束

#3楼    回复  引用  查看    

2008-04-05 00:07 by Kevin Li      
请问你是否牵涉了多表查询和级联更新的问题

#4楼 [楼主]   回复  引用  查看    

2008-04-05 00:40 by NafLian      
暂时没有,不过第二章有多表查询的小例子,因为我写这个的目的是可以让没有接触过2.0或者SQL的人能够从头开始学3.5,所以这些东西会一步一步讲,之后会讲到的

#5楼 [楼主]   回复  引用  查看    

2008-04-05 00:51 by NafLian      
多表查询这样就可以了
var product = from p in db.Products
where p.Category.CategoryName =="Produce"
select p;
级联更新也一样
这些内容都在LTS层自动的被放进了一个DataContext中,所有表和所有关系
出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。

输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。

官方网站 - http://***/yzm_advocr
识别效果怎么样一试就知道 - DEMO下载 http://***/yzm_advocr/advocr.rar

#7楼    回复  引用    

2008-04-26 16:08 by graystar [未注册用户]
对于更新和删除,如果先 Product pro = db.Products.Single(b => b.ProductID == productID);
取到数据,再做操作,是不是性能上有问题.

在asp.net 界面回传后,我通过界面取到product的相关更新数据,再single一下,感觉不是很好.
不知楼主有没有什么更好的方法.
pls mailto:greystar_cn@hotmail.com

#8楼    回复  引用    

2008-07-23 10:29 by wangzhen [未注册用户]
那个要查询的对象,不能做为参数吗?假如我有很多表的话!(假如我那个表不是product,还有其他很多表呢)

#9楼    回复  引用    

2008-08-26 16:13 by xinzehu [未注册用户]
关于更新,通常会涉及到每个字段的更新,如ProductName ,ProductAddress,ProductStyle等属性,在业务逻辑层如何处理?

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: