继续我之前的问题,我将id值从'Lookup'控制器传递给另一个控制器方法'Charges'。
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个值的列表。我认为这花了太长时间。有没有办法让它加载更快?
答案 0 :(得分:0)
关于列表,在视图中执行For Each
没有任何问题。如果需要,则需要它,没有理由避免它。
一些查询提示(由于缺乏细节,很难做得更好):
如果您的paid
和pvid
列为INT
,则不要使用LIKE @id
查询,而是使用= @id
(不%
}} 在里面)。即使它们是(N)VARCHAR
,那么使用LIKE也需要合理和明确。如果意外完成,则输出通常是错误的。
LIKE '%value%'
会导致索引被忽略,可能会导致性能下降。
确保您在用于加入的列上有索引。
尝试将两个查询合并为一个,以限制.NET / DB往返次数。