2009-07-02 25 views
2

基本的には、プロパティをプライベートにしておき、基本的にプロパティを生成してレイジー読み込みを行う、生成されたプロパティをロードするかどうかを:Entity Framework:遅延読み込み "ソリューション"の問題

public ChatRoom ParentRoom 
{ 
    get 
    { 
    if(!ParentRoomInnerReference.IsLoaded) 
    { 
     ParentRoomInnerReference.Load(); 
    } 

    return ParentRoomInner; 
    } 

    set 
    { 
    ParentRoomInner = value; 
    } 
} 

を今は、このようなもので(私は生成されたクラスのパーシャルクラス拡張中のすべての「クエリ」を持っているように)クラスにクエリでうまく動作します

context.Items.Where(ParentRoomInner.Id = someId).ToList(); 

このメソッドはItemクラス内にあるため、これを実行できます

context.Items.Where(ParentRoom.Id = someId).ToList(); 

エンティティフレームワークは、式を生成するためにそのプロキシプロパティが何であるか把握できないため、これは本当に問題になります。私は部屋のすべての投稿(項目)の数を取得しようとしています。私はItemクラス内ParentRoom(プロキシ)プロパティを使用することはできませんItemクラス内の同じ理由

public Int32 GetPostCount() 
{ 
    return EntityContext.Context 
      .ChatItems 
      .Count(item => item.ParentRoom.ChatRoomID == ChatRoomID); //Boom 
} 

、私はルームクラスのために、このクエリでそれを使用することはできません。エンティティのフレームワークはそのプロパティを把握できません。

私はParentRoomInnerプロパティを参照しているので、式を分解するときにそれを処理する方法を知ることができるように、ParentRoomプロパティにタグを付けることができるかもしれない何らかの属性がありますか?

私が考えることのできる唯一の代替案は、生成されたプロパティを内部にし、ParentRoomInnerプロパティ(meh)を使用するか、GetPostCountメソッドのようなメソッドをItemクラスに移動し、GetPostCountメソッドをルームクラスはそれを指します。 (恐ろしいことではなく、方法を倍増させる)

答えて

0

私は答えが "いいえ"であることを恐れています。 .NET 3.5ではこれを行う方法がありません。 .NET 4.0はもちろん、実際には怠惰な読み込みを行います。

GetPostCountをルームに置くことは、自分が行っていることに最適なようです。

+0

悲しいことに、徹底的な検索の後、私はあなたが正しいと思います。 –

+0

次の回避策があります: http://damieng.com/blog/2009/06/24/client-side-properties-and-any-remote-linq-provider –

+0

LinqKitとExpression > –

関連する問題