65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.24/5 (20投票s)

2009年7月8日

CPOL

3分钟阅读

viewsIcon

198386

downloadIcon

3599

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

目录

引言

这是一篇非常简短的文章,介绍了如何使用存储过程来丰富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调用函数。此函数返回一个实体集合的ISingleResultExecuteMethod调用函数是一个受保护的函数,只能通过继承来调用。我们调用存储过程的方法和函数通常构成我们的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(即用户定义函数)。如果IsComposablefalse,则表示它是存储过程;如果为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);
}

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.