.net 实体框架视图读取次数

.net 实体框架视图读取次数,.net,entity-framework,.net,Entity Framework,我对搜索人有一个相当复杂的看法。有几个链接表,如地址、电话、电子邮件、会员资格等。视图名为vSeachMember,实体名为vSeachMember 如果我在SQL Mgmt Studio中运行以下查询: Select * FROM vSearchMember WHERE FirstName like '%kelly%' var members = db.Members.Where(p => p.FirstName.Contains("kelly"); var query = from

我对搜索人有一个相当复杂的看法。有几个链接表,如地址、电话、电子邮件、会员资格等。视图名为vSeachMember,实体名为vSeachMember

如果我在SQL Mgmt Studio中运行以下查询:

Select * FROM vSearchMember WHERE FirstName like '%kelly%'
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();
它的运行时间约为2秒,读取次数约为160000次(使用sql profiler查找)

如果我在我的MVC应用程序中使用EF运行此代码(_db是上下文):

大约需要25秒,读取量为12000000次

我试图预先生成我的观点,但没有帮助。我也试着把懒虫关了。有什么想法吗?谢谢

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个字段)具有相同的语法。

检查EF生成的SQL。将查询与代码中的提取分开,如so和第二行的断点

var query = vSearchMembers.Where(p => p.FirstName.Contains("kelly") )
var p = query.ToList();
您可以通过检查查询来获取SQL

我不知道为什么,但我敢打赌这与手工编码的SQL查询完全不同

有兴趣查看vSearchMembers DDL

进一步编辑:

为了使注释中的代码更具可读性,可以尝试以下方法:

Select * FROM vSearchMember WHERE FirstName like '%kelly%'
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();

什么是vSearchMembers?这是你的背景吗?成员列表?它是视图的名称。我会更新这个问题,让它更清楚。谢谢。我怀疑这是生成的SQL。我期望的不是
=
比较,而是
=
。一个
=
将意味着“以开始”。好眼睛,是的,生成的代码是为一个以开始的。将其更改为包含并没有多大效果,实际上会使其速度稍微慢一点。所以问题依然存在!谢谢,我已经用EF生成的代码更新了我的问题。这是完全不同的。你知道怎么让它不那么可怕吗?那是一个令人讨厌的表情。我对一个表运行了一个.Conatins()查询,它可以找到WHERE。。喜欢表达式,所以它必须与视图有关。我没有将视图与EF一起使用-您是如何创建它的?它是MVC结构吗?Ref this answer,-表示可以将视图视为定义查询(表达式树),而不是表。这不是一个修复程序,但可能会解释冗长的代码。您可能希望尝试这样一个小把戏(假设成员是一个包含名字的表):var Members=db.Members.Where(p=>p.FirstName.Contains(“kelly”);var query=from-in-Members-from-from-s-in-vSearchMembers.Where(s=>s.MemberId==m.MemberId)选择s;var p=query.ToList();视图是使用“从数据库更新模型”添加到EF的edmx中的向导。您只需选择视图,它就会将其作为实体添加到您的模型中。昨天,我很沮丧地编写了一个存储过程,并使用EF运行了该过程。它非常快,与在sql studio中运行查询一样快。我可能会使用此方法进行大量搜索。不过,我会尝试您的代码建议,然后让您使用知道会发生什么。