我在数据库优先设计中使用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的行,但鉴于我的数据集在数百万条记录中,我遇到了“内存问题”。
答案 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);