Я разрабатываю проект с использованием EF 6. Таким образом, у меня есть эти слои в моем проекте:Entity Framework очень очень медленно в моем проекте около 2 мин для огромного количества данных
- Database (DbContext)
- IRepo
- Repo
- 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)
, но та же проблема.
сделать вам петлю над этими записями в цикле Еогеасп? перед вызовом .ToList(). Кроме того, если вам не нужно вносить изменения в записи, используйте .AsNoTracking(). – DevilSuichiro
@DevilSuichiro У меня нет цикла для извлечения данных, где я должен позвонить .tolist? –
либо непосредственно в этой функции, либо если вы действительно выполняете запрос, созданный этим IQueryable. – DevilSuichiro