【问题标题】:How do i pass values from view model to controller without use of list?如何在不使用列表的情况下将值从视图模型传递到控制器?
【发布时间】:2017-02-01 10:09:11
【问题描述】:

继续我之前的问题,我将 id 值从“查找”控制器传递到另一个控制器方法“费用”。

Function Charges(id As String) As ActionResult
        Dim Patient As New LookupVM()

        Patient.GetHistory(paid)

        Return View(Patient)
End Function

在视图模型中,我有 GetHistory(id) 列表方法,而 listProcedure 是包含我想要传递回控制器以在视图中显示的值的列表。

Public Property listProcedure As List(Of LookupVM)

Public Function GetHistory(id As String) As List(Of LookupVM)
    Using db As New DbContext()

        ' SQL query
        '====================
        Dim idd = New SqlParameter("@id", "%" & id & "%")
        Dim query As String = "select p.id id, pv.pvid pvid
                                    from patient p 
                                    join patient_visit pv on p.id = pv.id
                                    where p.paid like @id"
        Dim Results = db.Database.SqlQuery(Of LookupVM)(query, idd).ToList()

        For Each item In Results
            Dim pvid = New SqlParameter("@pvid", "%" & item.pvid & "%")
            Dim query2 As String = "select po.remarks remarks, po.entereddt entereddt, po.Consultant Consultant
                                    from procedure_order po 
                                    join procedures p on po.pdid = p.pdid
                                    where po.pvid like @pvid
                                    order by po.entereddt desc"
                Dim Results2 = db.Database.SqlQuery(Of LookupVM)(query2, pvid).ToList()

                For Each item2 In Results2
                    Dim ProcedureList2 As New LookupVM()
                    ProcedureList2.remarks = item2.remarks
                    ProcedureList2.entereddt = item2.entereddt
                    ProcedureList2.ForConsultant = item2.ForConsultant
                    listProcedure.Add(ProcedureList2)
                Next

        Next

        Return listProcedure
    End Using

End Function

我想知道我是否能够通过列表以外的其他方式将这些值传递给控制器​​。如果可能,它会是什么?因为如果它是一个列表,我无法在不使用 foreach 循环的情况下将它们显示在页面上。

另一个问题是,我的代码在概念上是正确还是错误?因为当我运行时,我花了 5 分钟来显示包含上述代码的 72 个值的列表。我觉得时间太长了。有什么办法让它加载更快?

【问题讨论】:

    标签: sql-server vb.net asp.net-mvc-viewmodel


    【解决方案1】:

    关于列表,在视图中执行For Each 并没有错。需要就需要,没有理由回避。

    一些查询提示(缺少细节很难做得更好):

    • 如果您的paidpvid 列是INT,则不要使用LIKE @id 查询它们,而是使用= @id(其中不包含%)。即使他们是(N)VARCHAR,那么使用 LIKE 也需要合理且明确。如果意外完成,那么输出通常会出错。

    • LIKE '%value%' 导致索引被忽略,可能导致性能不佳。

    • 确保您在用于 JOIN 的列上有索引。

    • 尝试将两个查询合二为一,以限制 .NET/DB 往返次数。

    【讨论】:

    • 我不得不使用 LIKE,因为它们不是 int 值。它的 varchar 因为它类似于“A123”。对不起,我不太明白:“在你用来加入的列上有索引。”我怎么知道我是否有索引?它们和主键一样吗?
    • 我不是在批评列表的使用。我仍然使用列表来显示表格中的值。只是我需要在视图中的不同位置显示值。为了便于理解,我以这个页面中我的值的位置为例。我想要实现的是类似于此页面右上角的“询问查看活动”部分。从数据库中检索值“今天”、“20 次”和“今天”。我必须为包含“询问查看等”的每个部分执行 foreach 循环。如果没有,当我运行没有值的页面时,整个部分都不会显示
    • 关于使用 LIKE,请记住,如果 A12 可以出现,那么 LIKE %A12% 将匹配 A12A123。关于索引:在 Management Studio 中,展开 [+] 表,然后展开 [+] 索引。如果需要,使用右键菜单项“新索引”。
    猜你喜欢
    • 2015-10-06
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多