我在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不是正确的工具吗?我在这里做错了吗?
答案 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