在EF 5中指定NoTracking MergeOption时出现错误

时间:2013-09-23 23:33:44

标签: c# linq entity-framework entity-framework-5

我在数据库优先设计中使用EntityFramework 5.0.0,并尝试使用http://blogs.msdn.com/b/dsimmons/archive/2010/01/12/ef-merge-options-and-compiled-queries.aspx

中解释的方法对非常大的结果集上的某些查询指定NoTracking MergeOption

我的代码类似于:

using (var dbContext = Utility.GetDataContext()) {
    IQueryable<EntityTypeA> entitiesQry = dbContext.EntitiesA.Where(x => (x.field== this.Property));
    ((System.Data.Object.ObjectQuery)entitiesQry).MergeOption = System.Data.Objects.MergeOption.NoTracking;

    foreach (var rec in entitiesQry) {
        // do things...
    }
}

但是,我在转换entityQry时遇到了运行时异常:

  

无法将类型为'System.Data.Entity.Infrastructure.DbQuery`1 [Namespace.EntityTypeA]'的对象强制转换为'System.Data.Objects.ObjectQuery'。

鉴于该文章的年龄和不同的命名空间,我猜这是在EF 4和EF 5之间发生了变化的?但是我找不到更合适的方式来指定MergeOption ......任何帮助都会受到赞赏。

要明确:我的代码运行完全正常,没有设置MergeOption的行,但鉴于我的数据集在数百万条记录中,我遇到了“内存问题”。

1 个答案:

答案 0 :(得分:3)

如果您想使用ObjectQuery,那么您需要获取基础ObjectContext并从那里制定您的查询。

ObjectQuery<EntitiesA> objQuery = ((IObjectContextAdapter)ctx)
   .ObjectContext.CreateObjectSet<EntitiesA>()
   .Where(x => x.field == this.Property);

如果您想使用DbContext API进行无跟踪查询,则可以使用AsNoTracking()

IQueryable<EntityTypeA> entitiesQry = dbContext.EntitiesA.AsNoTracking()
                           .Where(x => x.field== this.Property);