2011-01-19 10 views
0

申し訳ありませんが、これは本当に愚かな質問である場合、または他の場所で回答されているが、回答を見つけるのが難しい場合です。EF1:関連するオブジェクト全体を熱心に読み込む必要がないエンティティの外部キー

.Include("ParentEntity")を使用してそのエンティティを熱心に読み込まなくても、関連するエンティティの外部キーによってエンティティのリストをフィルタできます。これは、私にとっては魅力的ではないようです。私が望むだけで完全なオブジェクトを選択するのは、隠されているFKです。生成されたSQLが実行されたときに返されたデータにも含まれます。

これは私が何をしたいです:今、あなたは、これは大したことではないと思うかもしれ

from s in EfContext.Child 
.Include("Parent") 
where s.Parent.Id == 1 
select s; 

、しかしとき:

from s in EfContext.Child 
where s.Parent.Id == 1 
select s; 

は、これは私がしなければならないものですエンティティフレームワーク継承の実装であるごみを扱う場合、インクルードステートメントは、含まれるエンティティが他のエンティティの束の基本クラスである場合は、数百行のSQLを生成します(つまり、回避策。

this tip FKの偽装について語っていますが、LINQ文で偽のプロパティを使用することはできません。

私は、.NET 3.5 SP1とこだわっているように私は

おかげで、すべてのいずれかEF4を使用することはできません。

UPDATE:

だから、私の問題のための回避策をIを開発しました、私が後だと、逆さまの頭を私をピシャリと、これは物事の全くばかげ方法であることを教えてくれる人です:)

Parent parent = new Parent{Id = 1}; 
    _ctx.AttachTo("Parent",parent); 
    parent.Children.Load(); 
    //This requirement wasn't in the original question, but I've included for reference 
    foreach (Child child in Parent.Children) 
    { 
     child.GrandChildReference.Load(); 
    } 

    return from p in parent.Children 
      select p; 

答えて

0

あなたは言う:

は、これは私が何をしたいです:

...と、このコードを示します。

from s in EfContext.Child 
where s.Parent.Id == 1 
select s; 

は、あなたがそれを試してみましたか?これはEF 1ではうまくいきます。いいえInclude()が必要です。

+0

あなたは絶対に正しいですし、私は正しいdooshのように感じます。それはあなたが午前3時に問題を解決しようとするために得るものです。私が持っていた問題は、返されたオブジェクトを列挙するViewが親オブジェクトのIDにアクセスしようとしていることです。あなたが.Include()をしていなければそれが存在しないためです。 .Include()を使わずにParentオブジェクトのID(フィルタリングに使用されたID)を参照する最も良い方法は何ですか?おそらく、AlexJのEntityKey(私が最初の不吉な質問で参照した)を使用してTip 7? – Tr1stan

+0

私がこれを解決する方法は、ビューに必要なすべてのデータをフラット・タイプにしてから、そのタイプにL2Eクエリーで投影する専用のビュー・モデルを作成することです。これは常に動作します(また、 'Include()'は必要ありません)、最適なSQLが生成されます。 –

関連する問題