Я клонирую информацию пользователя, безопасность, отделы и несколько других таблиц информации для создания нового пользователя с одинаковой настройкой. Эта информация отображается через несколько DGV. Когда я использую обычный LINQ в контексте:Более эффективный способ отображения добавлений/удалений в контексте
var x = (from ctx in context.UserInfo
where ctx.UserID == userID
select ctx);
отображения информации практически мгновенно, но не отображается добавленный пользователь, если я не называю SaveChanges()
, который я стараюсь не делать.
Затем я перешел на использование местной LINQ:
context.UserInfo.Load();
var x = (from ctx in context.UserInfo.Local
where ctx.UserID == userID
select ctx);
Однако, несколько таблиц я запрашивающие иметь более 30К записей и .local вызов значительно замедляет процесс отображения информации. Из того, что я исследовал, это происходит из-за проверки достоверности.
Затем я попытался с помощью изменения трекера:
context.UserInfo.Load();
var x = (from ctx in context.ChangeTracker.Entries<UserInfo>()
where ctx.Entity.UserID == userID && ctx.State == EntityState.Unchanged ||
ctx.State == Entity.State.Added || ctx.State == EntityState.Modified
select ctx.Entity)
Это дало тот же плохую работу в качестве местного вызова.
Есть ли способ быстро отображать добавленные объекты, а не отображать удаленные объекты, без вызова Local или есть способ ускорить локальное?
Я провел много исследований и в течение нескольких дней работал над этими проблемами, пытаясь разобраться в этом самостоятельно, но сейчас я собираюсь по кругу.
Я думал о создании копии контекста, прежде чем будут сделаны изменения. Сохранение изменений по мере их возникновения, и если пользователь решает отменить создание клонированного пользователя, вызывая исходный контекст и сохраняя его, чтобы восстановить исходный контекст, но я бы подумал, что это последнее средство.
Проект делается в C# .net 4.5 и Entity Framework 5.0 на форме Windows
EDIT:
Чтобы дать больше кода о том, как запрос в числе:
У меня есть LoadData(), который инициализирует данные, которые я буду использовать.
public void loadData()
{
var x = (from ctx in context.UserInfo
select ctx).ToList();
}
Я считаю, что это будет делать то же самое, что и выше код
public void loadData()
{
context.UserInfo.load();
}
Тогда запрос называется: Это быстрый запрос, но не показывает контекст меняется
public List<UserInfo> getUserInfo()
{
var user = (from ctx in context.UserInfo
where ctx.UserID == userID
select ctx).ToList();
return user;
}
Этот запрос является медленным, но показывает изменения
public List<UserInfo> getUserInfo()
{
var user = (from ctx in context.UserInfo.Local
where ctx.UserID == userID
select ctx).ToList();
return user;
}
Что происходит до кода, который вы указали? Чтение данных из базы данных? Как добавляются новые сущности? Вы пытались вызвать 'ChangeTracker.DetectChanges()' в соответствующей точке кода? – qujck
Вы думали об использовании EF вместо этого? Он покажет вам добавленного пользователя без необходимости делать SaveCahnges() или загружать все сущности заранее. –
Вся информация находится на datalayer. Загружается репозиторий, устанавливается контекст, а затем выполняется запрос. Все это происходит при загрузке формы. Я добавляю объекты через context.UserInfo.add (пользователь). – EZE