我正在克隆用户的信息,安全性,部门和其他几个信息表,以创建具有相同设置的新用户。这些信息通过几个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);
但是,我查询的几个表有超过30k的条目,而.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或是否有办法加速Local?
我已经做了相当多的研究,并且已经解决了几天这个问题,试图自己解决这个问题,但我现在正在绕圈子。
我已经考虑过在创建更改之前创建上下文的副本。保存更改,如果用户决定取消克隆用户的创建,调用原始上下文并保存,恢复原始上下文,但我认为这是最后的手段。
该项目正在C#.net 4.5和Windows窗体上的Entity Framework 5.0中完成
编辑:
提供有关如何实施查询的更多代码:
我有一个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;
}
答案 0 :(得分:1)
我要在这里进行远景 - 我认为延迟低于EF初始化模型缓存时的标准延迟。有关详细信息,请参阅my answer on this question。您需要修改代码才能确定...
答案 1 :(得分:0)
最初,我没有意识到ToList()的行为方式与Load()相同。有了这个,我已经改变了我的代码,不再使用我的loadData()方法,但只初始化了我需要的部分信息。
public List<UserInfo>(int userID 1)
{
var data = (from ctx in context.UserInfo
where ctx.UserID == userID
select ctx).ToList();
List<UserInfo> user = (from ctx in context.UserInfo.Local
where ctx.UserID == userID
select ctx).ToList();
return user;
}
此更改允许我的查询几乎立即运行,并仍然跟踪上下文中的添加/删除/修改。我在这个方法中看到的唯一的缺点是,如果很多对象被加载到UserInfo.Local中,它将开始变慢,但在我的情况下很可能不会发生。