0

私はまだ問題を抱えていますが、ここの人々の助けを借りて少しずつ近づいています.

私は EF Profiler を使用しています。ダッシュボード コントローラーをロードすると、DB から「本質的に」同じデータを引き戻す多くのクエリが実行されていることがわかります。これが私のコントローラーの例です:

Public Class DashboardController
    Inherits BaseController

    Private ticketRepo As MaintenanceTicketsRepository

    Public Sub New()
        Me.ticketRepo = New MaintenanceTicketsRepository(New TicketContext)
    End Sub

    Function Chart_OpenItemsByPM() As ActionResult
        Dim tickets As IList(Of MaintenanceTicket) = ticketRepo.GetAll().Include(Function(p) p.Priority).Include(Function(s) s.Status).OrderBy(Function(o) o.PriorityId).ToArray()

        Dim queue As PieChartViewModel() = Mapper.Map(Of MaintenanceTicket(), PieChartViewModel())(tickets)

        Dim ticketCounts = From t In queue _
                           Where t.StatusName = "Open" And _
                           t.PriorityName <> "Not Ready" _
                           Group t By t.PriorityName Into Count() _
                           Select New With {
                               .PriorityName = PriorityName,
                               .Id = Count,
                               .Explosion = If(.PriorityName = "Critical", "True", "False")
                           }

        Return Json(ticketCounts)
    End Function

    Function Grid_OpenItemsByPriority(<DataSourceRequest()> request As DataSourceRequest) As ActionResult
        Dim tickets As IList(Of MaintenanceTicket) = ticketRepo.GetAll().Include(Function(p) p.Priority).Include(Function(s) s.Status).ToArray()

        Dim queue As GridViewModel() = Mapper.Map(Of MaintenanceTicket(), GridViewModel())(tickets)

        Dim ticketCounts = From t In queue _
                           Where _
                           t.StatusId = 1 And _
                           t.CreateDate.Year = Convert.ToDateTime(DateTime.Now).Year _
                           Group t By _
                           Column1 = CType(t.CreateDate.Month, Integer), _
                           Column2 = CType(t.CreateDate.ToString("MMMM"), String) _
                           Into g = Group _
                           Order By Column1 _
                           Select New With {
                               .Id = Column1,
                               .Month = Column2,
                               .Critical = g.Count(Function(t) t.PriorityId = 1),
                               .High = g.Count(Function(t) t.PriorityId = 2),
                               .Normal = g.Count(Function(t) t.PriorityId = 3),
                               .Low = g.Count(Function(t) t.PriorityId = 4),
                               .NotReady = g.Count(Function(t) t.PriorityId = 5),
                               .Total = g.Count(Function(t) t.Id <> Nothing)
                           }

        Return Json(ticketCounts.ToDataSourceResult(request))
    End Function

    Protected Overrides Sub Dispose(disposing As Boolean)
        ticketRepo.Dispose()
        MyBase.Dispose(disposing)
    End Sub
End Class

関数 (ajax を介して Kendo Controls に呼び出される) があることがわかりますが、各関数はリポジトリを埋めてから、データをビューモデルにマップします。最終的な出力を得るには、並べ替えて実際の手順を実行する必要があります。 . これを各関数で実行すると、ページの読み込み時間が長くなり、サーバーが急上昇しています。

1 つのクエリでレポを読み込む方法についてのアイデアはありますか?

4

1 に答える 1

0

結局、ストアド プロシージャを使用してリポジトリに返されるデータを制限し、データ アクセスを高速化しました。

于 2013-01-02T20:50:17.153 に答える