2016-08-07 13 views
0

Я разрабатываю проект с использованием EF 6. Таким образом, у меня есть эти слои в моем проекте:Entity Framework очень очень медленно в моем проекте около 2 мин для огромного количества данных

  1. Database (DbContext)
  2. IRepo
  3. Repo
  4. UI

Я настроил мой 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); 
} 

И в репо я реализующий эти интерфейсы, и в моем приложении (окна формы) Я впрыскивать эти репозитории к моей форме, используя 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, линия 1300 и 3300 листов, пользователь 1.

Когда я выполняю этот запрос, результат создается через 3 минуты, и когда он загружается, мое приложение работает очень медленно.

Я меняю первую строку моего запроса на from i in _ctx.Materials.take(20), но та же проблема.

+0

сделать вам петлю над этими записями в цикле Еогеасп? перед вызовом .ToList(). Кроме того, если вам не нужно вносить изменения в записи, используйте .AsNoTracking(). – DevilSuichiro

+0

@DevilSuichiro У меня нет цикла для извлечения данных, где я должен позвонить .tolist? –

+0

либо непосредственно в этой функции, либо если вы действительно выполняете запрос, созданный этим IQueryable. – DevilSuichiro

ответ

0

Я думаю, причина, по которой это очень медленно, - это множественное «соединение». Выполнение более двух «соединений» в одном запросе с использованием EF может быть очень быстрым.

Попробуйте отделить запрос или изменить код на Lazy. Загрузите все данные, которые вам нужны сразу после запроса, используя .Load().

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 
     }); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^