0

データベース優先の設計で EntityFramework 5.0.0 を使用しており、http://blogs.msdn.com/b/dsimmons/ で説明されている方法を使用して、非常に大きな結果セットに対するクエリで NoTracking MergeOption を指定しようとしています。 archive/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...
    }
}

ただし、entitiesQry をキャストするときに実行時例外が発生します。

タイプ '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 に答える