linq存储过程曾经一度困扰我。我下定决心要研究个明白,在我的仔细分析下,终于明白一些了,现在把得到的成果和大家分享一下。
linq存储过程默认生成的代码是ISingleResult的,也就是只能返回一条结果集,我们先动手脚,将其改成IMultipleResults 的.实体类根据不同情况更改.
linq存储过程更改前:
[Function(Name="dbo.MeterTaskStat")]
public ISingleResult<XXXX> MeterTaskStat
([Parameter(Name="MeterTaskType", DbType="Int")]
System.Nullable<int> meterTaskType,
[Parameter(Name="StartDate", DbType="DateTime")]
System.Nullable<System.DateTime> startDate,
[Parameter(Name="EndDate", DbType="DateTime")]
System.Nullable<System.DateTime> endDate)
{
IExecuteResult result =
this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())),
meterTaskType, startDate, endDate);
return ((ISingleResult<XXXXXX>)(result.ReturnValue));
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
linq存储过程更改后:
[Function(Name="dbo.MeterTaskStat")]
[ResultType(typeof(TaskStatData))]
public IMultipleResults MeterTaskStat
([Parameter(Name = "MeterTaskType", DbType = "Int")]
System.Nullable<int> meterTaskType,
[Parameter(Name = "StartDate", DbType = "DateTime")]
System.Nullable startDate,
[Parameter(Name = "EndDate", DbType = "DateTime")]
System.Nullable endDate)
{
IExecuteResult result =
this.ExecuteMethodCall
(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())),
meterTaskType, startDate, endDate);
return ((IMultipleResults)(result.ReturnValue));
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
注意到 多一条: [ResultType(typeof(TaskStatData))] 的记录吧,简单介绍一下,必须得为linq存储过程的结果返回一个实体类型,而TaskStatData就是自己定义的类,[ResultType(typeof(TaskStatData))]必须加上,加linq存储过程回值.
linq存储过程:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- ===================================================
-- Author:MaHong
-- Create date: 2008-09-11
-- Description: 根据口径统计某段时间内水表复装任务信息
-- ===================================================
ALTER PROCEDURE [dbo].[MeterTaskStat]
@MeterTaskType INT,
@StartDate DateTime,
@EndDate DateTime
AS
BEGIN
SET NOCOUNT ON;
SELECT MeterCaliberName,SUM(Requisition) AS
RequisitionCount,SUM(Approve) AS ApproveCount,
SUM(Disapprove) AS DisapproveCount,SUM(WaitWork) AS WaitWorkCount,
SUM(CompleteY) AS CompleteYCount,SUM(CompleteN) AS CompleteNCount,
SUM(Requisition+Approve+Disapprove+WaitWork+CompleteY+CompleteN) AS
Subtotal
FROM (SELECT MeterCaliberName
,CASE WHEN MeterTaskStatus=0 THEN 1 ELSE 0 END Requisition
,CASE WHEN MeterTaskStatus=1 THEN 1 ELSE 0 END Approve
,CASE WHEN MeterTaskStatus=11 THEN 1 ELSE 0 END Disapprove
,CASE WHEN MeterTaskStatus=2 THEN 1 ELSE 0 END WaitWork
,CASE WHEN MeterTaskStatus=4 THEN 1 ELSE 0 END CompleteY
,CASE WHEN MeterTaskStatus=5 THEN 1 ELSE 0 END CompleteN
FROM View_MeterTaskMaintain WHERE [MeterTaskType] =
@MeterTaskType AND StartDate BETWEEN @StartDate AND @EndDate) tempTable
GROUP BY MeterCaliberName
END
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
linq存储过程之在business中间层直接调用:
public class StatTaskControl : ControlBase
{
public IEnumerable GetStatInfo
(TaskType type, DateTime startDate, DateTime endDate)
{
IMultipleResults info =
Context.MeterTaskStat((int)type, startDate, endDate);
IEnumerable data = info.GetResult();
return data;
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
linq存储过程之ui层获取:
protected void StatButton_Click(object sender, EventArgs e)
{
DateTime startDate = DateTime.Parse(StartDate.Text);
DateTime endDate = DateTime.Parse(EndDate.Text);
TaskType type = TaskType.Remove;
IEnumerable info =
_control.GetStatInfo(type, startDate, endDate);
List data = info.ToList();
RemoveGridView.DataSource = data;
RemoveGridView.DataBind();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
整个linq存储过程大概就是这么几步.也不是太困难!
【编辑推荐】