我有一个相当复杂的搜索人的视图。有几个链接表,如地址,电话,电子邮件,会员资格等。视图名为vSeachMember,实体也是。
如果我在SQL Mgmt Studio中运行查询,请执行以下操作:
Select * FROM vSearchMember WHERE FirstName like '%kelly%'
它运行大约2秒钟,并且有大约160,000个读取(使用sql profiler找到)
如果我使用EF在我的MVC应用程序中运行此代码(_db是上下文):
var p = _db.vSearchMembers.Where(p => p.FirstName.Contains("kelly") ).ToList();
大约需要25秒,读数为12,000,000。
我试图预先生成我没有帮助的观点。我也尝试过关闭lazyload。有任何想法吗?感谢。
EF生成的代码:
exec sp_executesql N'SELECT
[Extent1].[Id] AS [Id],
...
FROM (SELECT
[vSearchMember].[Id] AS [Id],
...
FROM [dbo].[vSearchMember] AS [vSearchMember]) AS [Extent1]
WHERE ( CAST(CHARINDEX(LTRIM(RTRIM(@p__linq__0)), [Extent1].[FirstName]) AS int)) =
1',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'kelly'
上面的“......”是为了简洁而省略的,它对每个字段(其中29个)只有相同的语法。
答案 0 :(得分:1)
检查EF正在生成的SQL。将查询与代码中的提取分开,如第二行中的断点和
var query = vSearchMembers.Where(p => p.FirstName.Contains("kelly") )
var p = query.ToList();
您可以通过检查查询来获取SQL。
我不知道为什么,但愿意打赌它与你手工编写的SQL查询完全不同。
有兴趣查看vSearchMembers DDL。
进一步编辑:
只是为了让评论中的代码更具可读性,你可以尝试这样的事情:
var members = db.Members.Where(p => p.FirstName.Contains("kelly");
var query = from m in members
from s in vSearchMembers.Where(s => s.MemberId == m.MemberId)
select s;
var p = query.ToList();