2017-02-01 3 views
0

계속 이전 질문에서 '조회'컨트롤러의 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 루프를 사용하지 않고 페이지에 그들을 표시 할 수 없습니다.

또 다른 질문은 내 코드가 개념적으로 정확하거나 잘못 되었습니까? 왜냐하면 내가 실행했을 때 위의 코드와 관련된 72 개의 값 목록을 표시하는 데 5 분이 걸렸기 때문입니다. 나는 그것이 너무 오래 걸렸다 고 생각한다. 더 빨리로드 할 수있는 방법이 있습니까?

답변

0

목록에서보기에서 For Each을 수행하면 아무런 문제가 없습니다. 필요하다면 필요하고 피할 이유가 없습니다.

일부 쿼리 팁 (세부 사항의 부족을 더 잘 할 어렵습니다) :

  • 당신의 paidpvidINT을 인 경우에, 그들에 %없이 LIKE @id를 사용하지만 = @id를 (사용하여 쿼리하지 않습니다 그것). 비록 그들이 (N)VARCHAR이더라도 LIKE를 사용하는 것은 정당화되고 명시 적이어야합니다. 우연히 만난다면 출력은 종종 잘못 될 것입니다.

  • LIKE '%value%'으로 인해 색인이 무시되어 성능이 저하 될 수 있습니다.

  • JOIN을 사용하는 열에 인덱스가 있는지 확인하십시오.

  • 두 쿼리를 하나로 결합하여 .NET/DB 왕복 수를 제한하십시오.

+0

왜냐하면 그들은 int 값이 아니기 때문에 LIKE를 사용해야했습니다. 그것의 varchar 때문에 뭔가 'A123'. 죄송합니다. "JOIN을 사용하는 열의 색인이 있습니다." 인덱스가 있는지 어떻게 알 수 있습니까? 기본 키와 같은가요? – Nurul

+0

나는리스트의 사용을 비판하지 않는다. 나는 여전히 테이블에 값을 표시하기 위해 목록을 사용합니다. 그것의 단지 내가보기에 별도의 장소에 값을 표시해야합니다. 귀하의 이해를 돕기 위해이 페이지에서 나의 가치 배치의 예를 들겠습니다. 내가 성취하고자하는 것은이 페이지의 오른쪽 상단에있는 '요청 된 열어 본 활동'부분과 같습니다. 'today', '20 times'및 'today'값은 데이터베이스에서 검색됩니다. 나는 각각의 부분에 대해 foreach 루프를 수행해야만했다. 그렇지 않다면 아직 값이없는 페이지를 실행할 때 전체 부분이 표시되지 않습니다. – Nurul

+0

LIKE 사용에 관해서는 A12가 발생할 수 있다면 'LIKE % A12 %'는 'A12'와'A123' 둘 모두와 일치합니다. 인덱스 정보 : Management Studio에서 테이블을 확장 한 다음 [+] 인덱스를 확장합니다. 필요한 경우 마우스 오른쪽 버튼 메뉴 항목 "새 색인"을 사용하십시오. –