2016-02-12 23 views
5

私は非常に特殊な問題があります:ToList()拡張メソッドが結果をリストに変換できません。ここに私のコード、標準定型LINQクエリがある、私は良い測定のために二回Linq ToList()が即時実行を起動できません

var assets = new List<Asset>(); 

using (var ctx = new LeaseContext()) 
{ 
    assets = ctx.Assets.OrderBy(o => o.Reference).Where(w => w.Status == AssetStatus.Active).ToList(); 

    assets.ToList(); 
} 

return assets; 

ToList()を変換し、まだ資産はまだSystem.Data.Entities.DynamicProxiesのリストです....

私は前にこの問題を抱えていたことがありません。

+0

なぜ同じ変数にToList()を使用していますか? –

+0

2番目の 'ToList()'は 'ToList()'の結果を使用していないので何もしません。 –

+0

私は2番目のToList()が冗長であることを知っています。 – franklores

答えて

8

理由は遅延ロードです。遅延読み込みがEF(デフォルト)で有効になっている場合、EFは各エンティティの動的プロキシを作成します(デフォルトで)。関連するエンティティの読み込みに必要です。動的プロキシはエンティティクラスから継承されます。あなたの場合、それはAssetから継承されます。しかし、動的プロキシはそのインスタンスを作成したコンテキストを参照します。また、動的プロキシに格納されているコンテキストを使用してエンティティをクエリするためのナビゲーションプロパティ(仮想)を上書きします。

基本タイプのリストに派生タイプのインスタンスを追加することは完全に正当です。

ctx.Configuration.LazyLoadingEnabled = false; // turn-off loading on-demand 
ctx.Configuration.ProxyCreationEnabled = false; // turn-off wrapper class generation 

技術的には、あなただけのターンオフプロキシ生成と遅延ローディングが動作しませんすることができます:あなたが動的プロキシを使用しない場合

、そしてちょうど遅延ロードおよびプロキシの作成を無効にします。しかし、私は両方の設定を明示的にオフにすることを好みます。

+0

私はこのステートメントを追加しましたが、それでも動作しません。使用 (VARのCTX =新しいLeaseContext()) \t \t \t { \t \t \t \t ctx.Configuration.LazyLoadingEnabled = FALSE;\t \t \t \tアセット= ctx.Assets.OrderBy(o => o.Reference).Where(w => w.Status == AssetStatus.Active).Select(x => x).ToList(); \t \t \t} \t \t \t \t \t \tリターン資産。 – franklores

+0

@frankloresアセットをクエリするために 'cxt'を使う前に、この文を追加する必要があります –

+0

@franklores申し訳ありませんが、2番目の設定の設定は忘れています - プロキシの作成を無効にするために別のものがあります –

関連する問題