使用存储过程的六个简单步骤 LINQ






4.24/5 (20投票s)
在LINQ中使用存储过程的六个简单步骤。
目录
- 引言
- LINQ基础
- 步骤 1:创建存储过程
- 步骤 2:创建LINQ实体
- 步骤 3:继承自DataContext类
- 步骤 4:使用Function属性进行属性标记
- 步骤 5:调用ExecuteMethod方法
- 步骤 6:最后,我们在客户端调用数据上下文
引言
这是一篇非常简短的文章,介绍了如何使用存储过程来丰富LINQ对象。我写这篇文章的动机是ExecuteMethodCall
函数,它有助于在LINQ中执行存储过程。由于这是一个受保护的函数,它改变了您使用DataContext
类构建DAL的方式,您可能会想在此处进行一些调整和考虑。阅读下面的步骤时,您会看到更多详细信息。我正在编写一个庞大的LINQ FAQ系列,这些小型文章构成了完成大型FAQ系列的“小冲刺”。希望您喜欢。
LINQ基础
本文档假设您对如何使用LINQ丰富实体对象有基本了解。如果您不熟悉LINQ到SQL映射的基础知识,可以阅读我的文章以了解基本的LINQ概念,网址为OneManyandOneOneLINQ.aspx。
步骤 1:创建存储过程
下面是我们用来丰富LINQ对象的存储过程
Create PROCEDURE dbo.usp_SelectCustomer
AS
Select CustomerId,CustomerCode,CustomerName from Customer
RETURN
步骤 2:创建LINQ实体
上面的存储过程返回CustomerId、CustomerCode和CustomerName,因此我们需要根据返回的存储过程数据准备一个LINQ实体。如果您不熟悉LINQ实体,请阅读OneManyandOneOneLINQ.aspx中的基础知识。
[Table(Name = "Customer")]
public class clsCustomerEntity
{
private int _CustomerId;
private string _CustomerCode;
private string _CustomerName;
[Column(DbType = "nvarchar(50)")]
public string CustomerCode
{
set
{
_CustomerCode = value;
}
get
{
return _CustomerCode;
}
}
[Column(DbType = "nvarchar(50)")]
public string CustomerName
{
set
{
_CustomerName = value;
}
get
{
return _CustomerName;
}
}
[Column(DbType = "int", IsPrimaryKey = true)]
public int CustomerId
{
set
{
_CustomerId = value;
}
get
{
return _CustomerId;
}
}
}
步骤 3:继承自DataContext类
为了执行存储过程,LINQ提供了一个属于DataContext
类的ExecuteMethod
调用函数。此函数返回一个实体集合的ISingleResult
。ExecuteMethod
调用函数是一个受保护的函数,只能通过继承来调用。我们调用存储过程的方法和函数通常构成我们的DAL。换句话说,ExecuteMethod
应该是我们DAL的一部分。
如前所述,该函数是纯粹的protected
,您只能通过继承而不是聚合来调用它。我真的不确定微软为何设置这个强制要求,换句话说,我们需要创建一个继承自DataContext
的额外类,然后将相应的函数调用放入其中以调用存储过程。下面是代码片段,其中我们继承自DataContext
类并创建了一个名为ClsMyContext
的新DAL类。
public class clsMyContext : DataContext
{}
步骤 4:使用Function属性进行属性标记
我们创建了GetCustomerAll
函数,该函数使用System.Data.Linq.Mapping
命名空间中的Function
属性进行标记。Function
属性有一个name
参数,用于指定存储过程的名称;根据前面的步骤,该存储过程目前是usp_SelectCustomer
。
IsComposable
参数定义此方法调用是用于存储过程还是UDF(即用户定义函数)。如果IsComposable
为false
,则表示它是存储过程;如果为true
,则表示它是用户定义函数。
[Function(Name = "usp_SelectCustomer", IsComposable = false)]
public ISingleResult<clsCustomerEntity> getCustomerAll()
{
}
步骤 5:调用ExecuteMethod方法
现在是时候填充空的GetCustomerAll
函数了。下面是执行ExecuteMethod
调用的代码片段。此调用返回一个IExecuteResult
对象。
IExecuteResult objResult = this.ExecuteMethodCall(this,(MethodInfo)(MethodInfo.GetCurrentMethod()));
从IExecuteResult
返回的对象具有ReturnValue
属性,通过该属性我们可以获取ClsCustomerEntity
类型的返回结果集。
ISingleResult<clsCustomerEntity> objresults = (ISingleResult<clsCustomerEntity>) objResult.ReturnValue;
下面是包含该函数的完整代码片段
[Function(Name = "usp_SelectCustomer", IsComposable = false)]
public ISingleResult<clsCustomerEntity> getCustomerAll()
{
IExecuteResult objResult =
this.ExecuteMethodCall(this,(MethodInfo)(MethodInfo.GetCurrentMethod()));
ISingleResult<clsCustomerEntity> objresults =
(ISingleResult<clsCustomerEntity>) objResult.ReturnValue;
return objresults;
}
步骤 6:最后,我们在客户端调用数据上下文
在最后一步中,我们创建上下文对象,调用我们的函数,然后遍历对象集合以显示数据。
clsMyContext objContext = new clsMyContext(strConnectionString);
foreach(var row in objContext.getCustomerAll())
{
Response.Write(row.CustomerCode);
}
如需进一步阅读,请观看以下面试准备视频和分步视频系列。