個人的には、削減する必要のないものを考えすぎたり、削減しようとしていると思います。ストアドプロシージャのパラメータをそのままにしておくか、パラメータのセットをコマンドオブジェクトに追加できる基本クラスとヘルパー関数を作成することをお勧めします。
ただし、そうは言っても、私はあなたの質問に対する解決策を投げかけ、それがあなたのニーズに合うかどうかを確認します。
TSQLユーザー定義型を使用することをお勧めします。1つ以上のタイプを作成します。1つは日付範囲用で、もう1つはページングと並べ替え用です。複数行のデータをストアドプロシージャに渡すために、同様のプロセスを使用します。(このコードの一部は、すでに作成したコードを変更しているだけで、かなり長い間DataTableフィールドを操作していないため、少し調整する必要がある場合があります。)
最終的には、これは、アプリケーションメソッドと一致するストアドプロシージャのパラメータのリストを短縮することだけです。ストアドプロシージャは、テーブル変数の情報を抽出または結合する役割を果たします。以下にリストされているクラスは、これらのパラメーターを.NETアプリケーション側で強く型付けされたままにする機能を提供します。
if not exists (select * from INFORMATION_SCHEMA.DOMAINS where DOMAIN_SCHEMA = 'dbo' and DOMAIN_NAME = 'DateRange' and DATA_TYPE = 'table type')
begin
    create type dbo.DateRange as table 
    (
        StartDate datetime2 null
        ,EndDate datetime2 null
    )
end
go
if not exists (select * from INFORMATION_SCHEMA.DOMAINS where DOMAIN_SCHEMA = 'dbo' and DOMAIN_NAME = 'Paging' and DATA_TYPE = 'table type')
begin
    create type dbo.Paging as table 
    (
        PageNumber int null
        ,PageSize int null
        ,SortField sysname null
        ,SortDirection varchar(4) null
    )
end
go
SQLユーザー定義型は、.NETアプリケーションでは強く型付けされたオブジェクトとして表すことができます。基本クラスから始めます。
    Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Runtime.Serialization
    Namespace SqlTypes
        <Serializable()> _
        <System.ComponentModel.DesignerCategory("Code")> _
        Public MustInherit Class SqlTableTypeBase
            Inherits DataTable
            Public Sub New()
                MyBase.New()
                Initialize()
            End Sub
            Public Sub New(ByVal tableName As String)
                MyBase.New(tableName)
                Initialize()
            End Sub
            Public Sub New(ByVal tableName As String, ByVal tableNamespace As String)
                MyBase.New(tableName, tableNamespace)
                Initialize()
            End Sub
            Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
                MyBase.New(info, context)
            End Sub
            ''' <summary>
            ''' Implement this method to create the columns in the data table to match the SQL server user defined table type
            ''' </summary>
            ''' <remarks></remarks>
            Protected MustOverride Sub Initialize()
            Public Function CreateParameter(parameterName As String) As SqlParameter
                Dim p As New SqlParameter(parameterName, SqlDbType.Structured)
                p.Value = Me
                Return p
            End Function
        End Class
    End Namespace
SQLタイプの実装を作成します。
Imports System
Imports System.Data
Imports System.Runtime.Serialization
Namespace SqlTypes
    <Serializable()> _
    <System.ComponentModel.DesignerCategory("Code")> _
    Public Class DateRange
        Inherits SqlTableTypeBase
        Public Sub New()
            MyBase.New()
        End Sub
        Public Sub New(ByVal tableName As String)
            MyBase.New(tableName)
        End Sub
        Public Sub New(ByVal tableName As String, ByVal tableNamespace As String)
            MyBase.New(tableName, tableNamespace)
        End Sub
        Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
            MyBase.New(info, context)
        End Sub
        'TODO: throw some more overloaded constructors in here...
        Public Sub New(startDate As DateTime?, endDate As DateTime?)
            MyBase.New()
            Me.StartDate = startDate
            Me.EndDate = endDate
        End Sub
        Public Property StartDate As DateTime?
            Get
                Return CType(Me.Rows(0)(0), DateTime?)
            End Get
            Set(value As DateTime?)
                Me.Rows(0)(0) = value
            End Set
        End Property
        Public Property EndDate As DateTime?
            Get
                Return CType(Me.Rows(0)(1), DateTime?)
            End Get
            Set(value As DateTime?)
                Me.Rows(0)(1) = value
            End Set
        End Property
        Protected Overrides Sub Initialize()
            Me.Columns.Add(New DataColumn("StartDate", GetType(DateTime?)))
            Me.Columns.Add(New DataColumn("EndDate", GetType(DateTime?)))
            Me.Rows.Add({Nothing, Nothing})
        End Sub
    End Class
End Namespace
と:
Imports System
Imports System.Data
Imports System.Runtime.Serialization
Namespace SqlTypes
    <Serializable()> _
    <System.ComponentModel.DesignerCategory("Code")> _
    Public Class Paging
        Inherits SqlTableTypeBase
        Public Sub New()
            MyBase.New()
        End Sub
        Public Sub New(ByVal tableName As String)
            MyBase.New(tableName)
        End Sub
        Public Sub New(ByVal tableName As String, ByVal tableNamespace As String)
            MyBase.New(tableName, tableNamespace)
        End Sub
        Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
            MyBase.New(info, context)
        End Sub
        'TODO: throw some more overloaded constructors in here...
        Public Sub New(pageNumber As Integer?, pageSize As Integer?)
            MyBase.New()
            Me.PageNumber = pageNumber
            Me.PageSize = pageSize
        End Sub
        Public Sub New(sortField As String, sortDirection As String)
            MyBase.New()
            Me.SortField = sortField
            Me.SortDirection = sortDirection
        End Sub
        Public Sub New(pageNumber As Integer?, pageSize As Integer?, sortField As String, sortDirection As String)
            Me.New(pageNumber, pageSize)
            Me.SortField = sortField
            Me.SortDirection = sortDirection
        End Sub
        Public Property PageNumber As Integer?
            Get
                Return CType(Me.Rows(0)(0), Integer?)
            End Get
            Set(value As Integer?)
                Me.Rows(0)(0) = value
            End Set
        End Property
        Public Property PageSize As Integer?
            Get
                Return CType(Me.Rows(0)(1), Integer?)
            End Get
            Set(value As Integer?)
                Me.Rows(0)(1) = value
            End Set
        End Property
        Public Property SortField As String
            Get
                Return CType(Me.Rows(0)(2), String)
            End Get
            Set(value As String)
                Me.Rows(0)(2) = value
            End Set
        End Property
        Public Property SortDirection As String
            Get
                Return CType(Me.Rows(0)(3), String)
            End Get
            Set(value As String)
                Me.Rows(0)(3) = value
            End Set
        End Property
        Protected Overrides Sub Initialize()
            Me.Columns.Add(New DataColumn("PageNumber", GetType(Integer?)))
            Me.Columns.Add(New DataColumn("PageSize", GetType(Integer?)))
            Me.Columns.Add(New DataColumn("SortField", GetType(String)))
            Me.Columns.Add(New DataColumn("SortDirection", GetType(String)))
            Me.Rows.Add({Nothing, Nothing, Nothing, Nothing})
        End Sub
    End Class
End Namespace
オブジェクトをインスタンス化し、コンストラクターで値を設定してから、オブジェクトからパラメーターを取得し、それをストアドプロシージャコマンドオブジェクトのパラメーターコレクションに追加します。
cmd.Parameters.Add(New DateRange(startDate, endDate).CreateParameter("DateRangeParams"))
cmd.Parameters.Add(New Paging(pageNumber, pageSize).CreateParameter("PagingParams"))
編集
この答えは強い型付けを中心に展開しているので、メソッドシグネチャに強い型付けの例を追加する必要があると思いました。
'method signature with UDTs
Public Function GetMyReport(customParam1 as Integer, timeFrame as DateRange, pages as Paging) as IDataReader
'method signature without UDTs
Public Function GetMyReport(customParam1 as Integer, startDate as DateTime, endDate as DateTime, pageNumber as Integer, pageSize as Integer)