0

我在数据库优先设计中使用 EntityFramework 5.0.0,并尝试使用http://blogs.msdn.com/b/dsimmons/中解释的方法对非常大的结果集的某些查询指定 NoTracking MergeOption存档/2010/01/12/ef-merge-options-and-compiled-queries.aspx

我的代码看起来像:

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 的行的情况下运行得非常好,但是鉴于我的数据集包含数百万条记录,我遇到了“内存问题”。

4

1 回答 1

3

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

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

如果您不希望使用DbContextAPI 进行跟踪查询,则可以使用AsNoTracking()

IQueryable<EntityTypeA> entitiesQry = dbContext.EntitiesA.AsNoTracking()
                           .Where(x => x.field== this.Property);
于 2013-09-24T06:12:04.330 回答