1. 程式人生 > >Linq to Sql學習總結3

Linq to Sql學習總結3

儲存過程:

關係資料庫中的儲存過程在實體類中對映為具體的方法,直接將儲存過程拖動到對應的dbml設計檢視中即可,如圖:

image

在將儲存過程拖入dbml設計檢視中時,系統執行了如下命令:

SET FMTONLY ON;--表示只獲取結果集的元資料(即相關列名 )
exec sp_Name
SET FMTONLY OFF;

方法的返回物件根據獲取到的元資料確定(在dbml的cs檔案中定義了一個部分實體類用於返回物件,實體類屬性為獲取到的元資料,這也說明了在查詢的儲存過程的句法中的操作是屬於linq to object的)。

儲存過程方法定義:

--單結果集儲存過程定義

[global
::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.sp_SingleResultSet")] public ISingleResult<sp_SingleResultSetResult> sp_SingleResultSet() { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))); return ((ISingleResult<sp_SingleResultSetResult
>)(result.ReturnValue)); } --多結果集儲存過程定義
[Function(Name="dbo.sp_multiresultset")]
     //定義返回值型別
[global::System.Data.Linq.Mapping.ResultType(typeof(Customers))]
[global::System.Data.Linq.Mapping.ResultType(typeof(Employees))]
    //返回型別由ISingleResult<sp_SingleResultSetResult>改為IMultipleResults
    
public IMultipleResults sp_multiresultset() { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))); return (IMultipleResults)(result.ReturnValue); }

單結果集儲存過程:

var 單結果集儲存過程 =
            from c in ctx.sp_singleresultset()
            where c.CustomerID.StartsWith("A")
            select c;

帶引數儲存過程:

//帶引數儲存過程,Linq會將procedure中的output引數定義為linq to sql類中的ref引數
create proc [dbo].[sp_withparameter]
@customerid nchar(5),
@rowcount int output
as
set nocount on
set @rowcount = (select count(*) from customers where customerid = @customerid)

//方法呼叫
 int? rowCount = -1;
 ctx.sp_WithParameter("",ref rowCount);

帶返回值的儲存過程:

//帶返回值的儲存過程,Linq會將procedure中的返回值定義為linq to sql類方法(返回實體集的方法定義)的返回值
create proc [dbo].[sp_withreturnvalue]
@customerid nchar(5)
as
set nocount on
if exists (select 1 from customers where customerid = @customerid)
return 101
else
return 100

//方法呼叫
Response.Write(ctx.sp_withreturnvalue(""));

多結果集儲存過程:

//多結果集儲存過程(生成的linq to sql類只返回了第一個結果集的實體)
//需要手動修改返回實體結果集的方法定義
create proc [dbo].[sp_multiresultset]
as
set nocount on
select * from customers
select * from employees

//方法呼叫
var qMultiResultSet = ctx.sp_multiresultset();
var qCustomersSet = qMultiResultSet.GetResult<Customers>();
var qEmployeesSet = qMultiResultSet.GetResult<Employees>();

為實體類配置增刪改行為:

1、先定義用於增刪改的儲存過程,並對映成相應的方法;

2、在dbml設計檢視中為實體類配備相應儲存過程方法用於增刪改行為,如圖:

image

配置完成之後再dbml中cs檔案中生成如下方法:

#region 為實體類的增刪改行為配置的方法(方法使用儲存過程生成)
        private void InserttbGuestBook(tbGuestBook obj)
        {
            this.sendmessage(obj.UserName, obj.Message);
        }

        private void UpdatetbGuestBook(tbGuestBook obj)
        {
            this.replymessage(((System.Nullable<int>)(obj.ID)), obj.Reply);
        }

        private void DeletetbGuestBook(tbGuestBook obj)
        {
            this.delmessage(((System.Nullable<int>)(obj.ID)));
        }
        #endregion
呼叫方式如下:
ctx.delmessage(Convert.ToInt32(e.CommandArgument.ToString()));
ctx.replymessage(Convert.ToInt32(e.CommandArgument.ToString()), ((TextBox)e.Item.FindControl("tb_Reply")).Text);
//在配置更新行為時,對於傳入引數有兩個可選值原始值(original)和當前值(current),原始值表示更新之前的值,當前值表示當前需要更新的值
//在配置類行為的時候,oldusername使用原始值,newusername使用當前值
 ctx.modiusername("admin", "notadmin");