2017-02-01 11 views
0

私の前の質問から引き続き、私はID値を 'Lookup'コントローラから別のコントローラメソッド 'Charges'に渡します。ビューモデルにおいてリストを使用せずにビューモデルからコントローラに値を渡すにはどうすればよいですか?

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

     Patient.GetHistory(paid) 

     Return View(Patient) 
End Function 

、iがGetHistory(ID)リストの方法があり、listProcedure iがビューに表示されるコントローラに戻って渡したい値を保持するリストです。

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を実行することに何も問題ありません。それが必要な場合は、それが必要であり、それを避ける理由はありません。

一部のクエリヒント(細部の欠如のためのより良いを行うのは難しいです):

  • あなたpaidpvid列がINTている場合は、中%なし(LIKE @idを使用しますが= @idを使用してそれらを照会しません。それ)。たとえそれらが(N)VARCHARであっても、LIKEを使用することは、正当で明示的にする必要があります。事故によって行われた場合、出力はしばしば間違っています。

  • LIKE '%value%'インデックスが無視され、パフォーマンスが低下する可能性があります。

  • JOINに使用する列にインデックスがあることを確認してください。

  • 2つのクエリを1つに結合して、.NET/DBラウンドトリップの数を制限してみてください。

+0

これは、int値ではないため、LIKEを使用する必要がありました。それは 'A123'のようなものなので、そのvarchar。申し訳ありませんが、私はかなり理解していません: "あなたがジョインするために使用する列にインデックスを持っています。"インデックスがあるかどうかはどうすればわかりますか?それらは主キーと同じですか? – Nurul

+0

私はリストの使用を批判していません。私はまだテーブルの値を表示するためにリストを使用します。ビューの別々の場所に値を表示する必要があります。あなたの理解を容易にするために、私はこのページから私の値の配置の例を取っ​​ています。私が達成しようとしているのは、このページの右上にある「尋ねられた閲覧済み」のようなものです。値「today」、「20 times」および「today」がデータベースから取り出されます。私はそれぞれの部分にforeachループを実行しなければなりませんでした。そうでない場合は、まだ値がないページを実行すると、その部分全体が表示されません。 – Nurul

+0

LIKEの使用について、A12が発生すると、 'LIKE%A12%'は 'A12'と' A123'の両方と一致します。インデックスについて:Management Studioで、テーブルを展開して[+]インデックスを展開します。必要に応じて、右クリックメニュー項目「新規索引」を使用します。 –

関連する問題