在上下文中显示添加/删除的更有效方法

时间:2013-06-18 15:38:27

标签: c# linq entity-framework

我正在克隆用户的信息,安全性,部门和其他几个信息表,以创建具有相同设置的新用户。这些信息通过几个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;
}

2 个答案:

答案 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中,它将开始变慢,但在我的情况下很可能不会发生。