zoukankan      html  css  js  c++  java
  • linq存储过程返回多条结果集

       曾经被linq存储过程返回多个结果所困扰,今晚加班,问题解决,分享一下思路:

    linq默认生成的代码是ISingleResult的,也就是只能返回一条结果集,我们先动手脚,将其改成IMultipleResults 的.实体类根据不同情况更改.

    更改前:

      [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));
      }

    更改后:

      [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<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 ((IMultipleResults)(result.ReturnValue));
      }

    注意到 多一条:       [ResultType(typeof(TaskStatData))] 的记录吧,简单介绍一下,必须得为存储过程的结果返回一个实体类型,而TaskStatData就是自己定义的类,[ResultType(typeof(TaskStatData))]必须加上,加存储过程返回值.

    存储过程:

    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

    然后在business中间层直接调用:

        public class StatTaskControl : ControlBase
        {
            public IEnumerable<TaskStatData> GetStatInfo(TaskType type, DateTime startDate, DateTime endDate)
            {
                IMultipleResults info = Context.MeterTaskStat((int)type, startDate, endDate);
                IEnumerable<TaskStatData> data = info.GetResult<TaskStatData>();

                return data;
            }
        }

    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<TaskStatData> info = _control.GetStatInfo(type, startDate, endDate);
                List<TaskStatData> data = info.ToList();

                RemoveGridView.DataSource = data;
                RemoveGridView.DataBind();
            }

    整个过程大概就是这么几步.也不是太困难!

  • 相关阅读:
    模拟赛20181101 雅礼 Wearry 施工 蔬菜 联盟
    模拟赛20181031 雅礼 Wearry 养花 折射 画作
    set/priority_queue的运算符重载
    set的完整用法
    最长公共上升子序列 O(n^2)
    无向图边双联通分量 tarjan 模板
    ID 迭代加深搜索 模板 埃及分数
    树上背包DP Luogu P2014 选课
    A* 第k短路
    [POJ3468]关于整数的简单题 (你想要的)树状数组区间修改区间查询
  • 原文地址:https://www.cnblogs.com/mahong/p/1289525.html
Copyright © 2011-2022 走看看