实体框架视图读取次数

时间:2013-03-07 18:07:14

标签: .net entity-framework

我有一个相当复杂的搜索人的视图。有几个链接表,如地址,电话,电子邮件,会员资格等。视图名为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个)只有相同的语法。

1 个答案:

答案 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();