使用EntityFramework进行搜索非常缓慢。如何提高查询速度?

时间:2015-07-01 07:14:45

标签: sql-server performance entity-framework linq-to-entities entity-framework-5

我在MVC 4网站上使用Entity Framework 5.0.0。

网站的一部分允许用户搜索数据库中的记录。搜索可能包含最多10个可能触及(生成where子句)4-5个表的搜索条件,并从14个表中返回数据。

搜索页面提供了许多搜索字段:关键字,标题,日期等。

搜索功能允许搜索词的“OR”或“AND”组合。 例如,可以要求标题和日期匹配,或者标题或日期匹配。

查询看起来与此类似:

Dim searchQuery As IQueryable(Of MainTableClass) = Nothing
Dim query As IQueryable(Of MainTableClass) = Nothing
Dim queries As List(Of IQueryable(Of MainTableClass)) = New List(Of IQueryable(Of MainTableClass))

Using database As DataContext = new DataContext
    searchQuery = ( From x In database.MainTableClasses. _
                            Include("Secondary.Third.Fourth"). _
                            Include("Secondary.Fifth.Sixth"). _
                            Include("Eighth"). _
                            Include("Nine.Ten.Eleven.Twelve"). _
                            Include("Thirteen.Fourteen")
                Select x)
    '   Some things here to limit the initial set that searchQuery returns
    '   eg:  searchQuery = searchQuery.Where(Function(m) m...blah blah)

    If Not String.IsNullOrEmpty(model.Title) Then
        query = (From x In database.MainTableClasses Where x.Secondary.Title = model.Title Select x)
        queries.Add(query)
    End If

    If Not Nothing Is model.Date Then
        query = (   From x In database
                    Where x.Nine.Any(Function(a) model.Date < a.Value)  )
        queries.Add(query)
    End If


    '
    '   Now to combine the results
    '
    For Each item As IQueryable(Of MainTableClass) In queries
        Select Case model.SearchType
            Case SearchType.OR      '   Or the search terms
                searchQuery = searchQuery.Union(item)

            Case Else               '   And the search terms
                searchQuery = searchQuery.Intersect(item)

        End Select
    Next

    '
    '   Run the query
    '
    results = searchQuery.ToList
End Using

问题在于Linq正在将实际查询转换为5700行SQL,并且在Azures最大的SQL数据库产品上运行需要9秒多。完全不能接受。我可以在30行内手动编写SQL中的主搜索查询。

那么,我该怎么做才能重构这个查询以使其运行得更快? EF / Linq不是正确的工具吗?我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

因此,我提出的解决方案是手动编写SQL,让Linq-To-SQL执行ORM函数来填充我的数据模型:

Dim sql As String = "SELECT ... FROM Classes WHERE ..."
Dim model As SearchResultsModel = Nothing

model = database.Classes.SqlQuery(sql).ToList