实体框架在我的项目中非常慢,大约2分钟用于大量数据

时间:2016-08-07 08:51:52

标签: c# performance entity-framework ninject

我正在使用EF 6开发一个项目。所以我在项目中有这些图层:

  1. 数据库(dbcontext)
  2. IRepo
  3. 回购
  4. UI
  5. 我在数据库层中配置了EF,如下所示:

    public class DataContext : DbContext
    {
        public DataContext() : base("DefaultConnection")
        {
                this.Configuration.LazyLoadingEnabled = false;
                this.Configuration.ProxyCreationEnabled = false;
    
                Database.SetInitializer(
                    new MigrateDatabaseToLatestVersion<DataContext, MigrationsConfiguration>()
                    );
        }
    
        public DbSet<Line> Lines { get; set; }
        public DbSet<Spool> Spools { get; set; }
        /......
    }
    

    在我的IRepo我定义了我的界面:

    public interface IEndRepository
    {
            IQueryable<End> Get();
            bool Save();
            bool Add(End newValue);
            bool Delete(End deletedValue);
            bool Edit(End UpdatedValue);
            IQueryable<End> FindById(int Id);
    }
    

    在repo中我实现了这些接口,在我的应用程序(windows窗体)中,我使用ninject将这些存储库注入到我的表单中。我的一个查询看起来像这样:

    public IQueryable<ViewMaterial> ViewIMaterial()
    {
        return (from i in _ctx.Materials
                join material in _ctx.MaterialDescriptions on i.MaterialDescriptionId equals material.Id
                join Line in _ctx.Lines on i.LineId equals Line.Id
                join user in _ctx.Users on i.UserId equals user.Id
                join sheet in _ctx.Sheets on i.SheetId equals sheet.Id
                select new ViewMaterial
                       {
                          Id = i.Id,
                          LineId = Line.LineNumber,
                          SheetId = sheet.SheetNumber,
                          Discipline = i.Discipline,
                          Quantity = i.Quantity,
                          MaterialDescriptionId = material.ItemCode,
                          SubmitDateTime = i.SubmitDateTime,
                          UserId = user.FullName
                        });
    }
    

    此查询位于Repo图层内,材质中的行数为16000,materiaddescription为42000,line为1300,sheet为3300,user为1。

    当我执行此查询时,结果会在3分钟后生成,加载后我的应用程序运行速度非常慢。

    我将查询的第一行更改为from i in _ctx.Materials.take(20)但问题相同。

2 个答案:

答案 0 :(得分:0)

我认为它很慢的原因是多次“加入”。 使用EF在单个请求中执行2次以上“加入”可能会很快。

尝试将请求分开或将代码更改为Lazy在查询后立即使用.Load()加载所需的所有数据。

答案 1 :(得分:0)

请尝试以下代码:

public IQueryable<ViewMaterial> ViewIMaterial()
{
    return _ctx.Materials.Take(20)
        .Select(e=> new ViewMaterial
        {
            Id = e.Id,
            LineId = e.Line.LineNumber,
            SheetId = e.Sheet.SheetNumber,
            Discipline = e.Discipline,
            Quantity = e.Quantity,
            MaterialDescriptionId = e.MaterialDescriptions.ItemCode,
            SubmitDateTime = e.SubmitDateTime,
            UserId = e.User.FullName
        });
}