Frameworks 缺少属性时,代码优先实体框架会变慢

Frameworks 缺少属性时,代码优先实体框架会变慢,frameworks,ef-code-first,entity,Frameworks,Ef Code First,Entity,我首先使用实体框架4.3.1代码 我有一个非常简单的表达式和实体模型 using (var PMCtx = new PMContext("PMEntities")) { var results = PMCtx.Fetch<vwSDHOriginalMW>() .Where(x => x.DT >= StartDate && x.DT < EndDate)

我首先使用实体框架4.3.1代码

我有一个非常简单的表达式和实体模型

using (var PMCtx = new PMContext("PMEntities"))
{        
     var results =
            PMCtx.Fetch<vwSDHOriginalMW>()
            .Where(x => x.DT >= StartDate && x.DT < EndDate)
            .ToList();
     return results;
}

public class vwSDHOriginalMW : IEntityObject, IPMContext
{
    public int Schedule { get; set; }
    public DateTime DT { get; set; }
    public int HE { get; set; }
    public Decimal OrgMW { get; set; }        
    public Decimal DELIVERMW { get; set; }
    public string NERCCode { get; set; }
    public string NERCCodeStatus { get; set; }
    public int SDHSDHID { get; set; } 
}
在昨天添加了这个属性之后,它在一段时间内急剧加速,运行时间从15秒缩短为4秒。但今天它又变慢了,什么都没有改变

更新: 我把范围缩小了一点。我可以使用两种方法,最终使用相同的FetchSet。我使用的那个返回IQueryable而不是IEnumerable。这似乎很正常,因为我在之后进行过滤,这是最理想的。但是,返回IQueryable的方法需要15秒,而IEnumerable的时间不到一秒。(我对这两个函数都调用了ToList())FetchAll原来只是一个调用Fetch并返回IEnumerable而不是IQueryable的包装器

public IQueryable<TEntity> Fetch<TEntity>() where TEntity : class, Common.IEntityObject
{
    return privateContext.Fetch<TEntity>();
}

public IEnumerable<TEntity> FetchAll<TEntity>() where TEntity : class, Common.IEntityObject
{
        return privateContext.FetchAll<TEntity>();
}
public IQueryable Fetch(),其中tenty:class,Common.IEntityObject
{
返回privateContext.Fetch();
}
public IEnumerable FetchAll(),其中tenty:class,Common.IEntityObject
{
返回privateContext.FetchAll();
}
如果我改变

IEnumerable<vwSDHOriginalMW> results =
                   PMCtx.Fetch<vwSDHOriginalMW>()
                   .Where(x => x.DT >= StartDate && x.DT < EndDate)
                   .ToList();
IEnumerable结果=
PMCtx.Fetch()
其中(x=>x.DT>=StartDate和&x.DT

IEnumerable结果=
PMCtx.Fetch()
托利斯先生()
其中(x=>x.DT>=StartDate和&x.DT

它很快。但这是不可接受的,因为我似乎希望将where子句传递到数据库。在本例中,在dev环境中,视图只有180行,但它可能有数百万行,因此我肯定不想在筛选之前将所有结果返回内存。

经过大量挖掘和许多麻烦之后,我发现该视图引用的是另一个数据库实例上的视图,该实例引用的表缺少非聚集索引。这导致执行计划缓存不正确。在其他数据库上添加索引后:

USE [OTHERDATABASE]
GO
CREATE NONCLUSTERED INDEX [IX_ScheduleEnergyProfileJoin]
ON [dbo].[WTXS_ScheduleEnergyProfile] ([SEQSDR])
INCLUDE ([SEQSEPI],[StartDate],[EndDate])
GO
然后使用我正在使用的视图清除数据库上的执行计划缓存:

USE [MYDATABASE]

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
查询正在快速运行。因此,EF说它正在使用的SQL可能不是发送到数据库的SQL。这个故事的寓意是,我应该尽一切努力来获得这个数据库的分析权限,而不是依赖下面的命令来输出实际发送的SQL

var sql = ((System.Data.Entity.Infrastructure.DbQuery<vwSDHOriginalMW>)results).ToString();
var sql=((System.Data.Entity.Infrastructure.DbQuery)results).ToString();

什么是“IEntityObject”?您是否禁用了惰性加载?正在生成的示例SQL是什么?你的取回方法是什么样的?更新了原始帖子。IEntityObject只是一个空的标记接口。其他细节在帖子里。我错过了这部分。是的,看起来延迟加载已禁用。打开它没有任何效果。无论如何,视图只有184行。添加到CheckedTypes肯定有原因,但请先尝试从数据库中获取实体集而不使用泛型,以查看它的速度:例如,PMCtx.YourEntitySet.Where(x=>x.DT>=StartDate&&x.DTIEnumerable<vwSDHOriginalMW> results = PMCtx.Fetch<vwSDHOriginalMW>() .ToList() .Where(x => x.DT >= StartDate && x.DT < EndDate);
USE [OTHERDATABASE]
GO
CREATE NONCLUSTERED INDEX [IX_ScheduleEnergyProfileJoin]
ON [dbo].[WTXS_ScheduleEnergyProfile] ([SEQSDR])
INCLUDE ([SEQSEPI],[StartDate],[EndDate])
GO
USE [MYDATABASE]

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
var sql = ((System.Data.Entity.Infrastructure.DbQuery<vwSDHOriginalMW>)results).ToString();