我对搜索人有相当复杂的看法。有几个链接表,如地址、电话、电子邮件、会员资格等。该视图名为 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 次读取。
我试图预先生成我的观点,但没有帮助。我也试过关闭延迟加载。有任何想法吗?谢谢。
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 个)。