2012-01-23 8 views
0

Entityframeworkモデルでは、タイプ/テーブル "ModelElement"があります。これはタイプ/テーブル "ElementToComponentMapping"にリンクされています。ナビゲーション/外部キーは "ModelID"と "ElementNo"です。EntityFramework/LINQ - 関連するテーブル/タイプからフィルタリングされたコンテンツを取得する

ModelElementインスタンスにリンクされたElementToComponentMappingのコンテンツも含まれる、特定のフィルタリング条件に基づいてModelElementのインスタンスを返すメソッドを記述する必要があります。課題は、私がElementToComponentMappingから返すものをフィルタリングする必要があるということです。つまり、使用することができないように見えます。インクルード

これは機能しません。インクルード/私の第二の試行が別々に関連する「ElementToComponentMappingsを」OUT照会次に、第一主「ModelElement」オブジェクトを照会することであった、と設定

public ModelElement GetModelElement(int modelID, int modelElementNo, int version) 
{ 
    return (from c in context.ModelElements.Include("ElementToComponentMapping") 
      where c.ModelID == modelID && c.ElementNo == modelElementNo 
       && c.ElementToComponentMappings.Where(m => m.version == version) 
        select c).FirstOrDefault(); 
} 

where句のナビゲーションタイプその「ModelElement」

のプロパティとして
public ModelElement GetModelElement(int modelID, int modelElementNo, int version) 
{ 
ModelElement newElement = (from c in context.ModelElements 
        where c.ModelID == modelID && c.ElementNo == modelElementNo 
        select c).FirstOrDefault(); 
newElement.ElementToComponentMappings = 
         (from m in context.ElementToComponentMappings 
          where m.ModelID == modelID 
          && m.ElementNo == modelElementNo 
          && m.version == version 
           select m).FirstOrDefault(); 
return newElement; 
} 

しかしこれも"ElementToComponentMappings"オブジェクトを直接クエリすることによって返される型が "ModelElement"オブジェクトの "ElementToComponentMappings"プロパティと異なるため、機能しません。

これは単純な操作のようです - 外部キーリンクテーブルの値を取得します。ここではFKテーブルの内容からフィルタをかけることができます。

答えて

1

newElement.ElementToComponentMappingsはコレクションですが、クエリで単一インスタンスのみが返されるため、タイプが異なります。

あなたはこれを使用しようとすることができます:

context.ContextOptions.LazyLoadingEnabled = false; 
var newElement = (from c in context.ModelElements 
        where c.ModelID == modelID && c.ElementNo == modelElementNo 
        select c).FirstOrDefault(); 

var mapping = (from m in context.ElementToComponentMappings 
       where m.ModelID == modelID 
        && m.ElementNo == modelElementNo 
        && m.version == version 
       select m).FirstOrDefault(); 

// now check if newElement.ElementToComponentMappings contains your single item 

ます。また、これを使用しようとすることができます:

context.ContextOptions.LazyLoadingEnabled = false; 
var newElement = (from c in context.ModelElements 
        where c.ModelID == modelID && c.ElementNo == modelElementNo 
        select c).FirstOrDefault(); 

((EntityCollection<ElementToComponentMappings>)newElement.ElementToComponentMappings) 
    .CreateSourceQuery() 
    .FirstOrDefault(m.version == version); // You don't need to check FKs here 

// now check if newElement.ElementToComponentMappings contains your single item 

あなたのタイプがプロキシされ、遅延ロードは、このため有効になっている場合、これらの方法のどちらの作品予想される自動リレーションフィックスアップではナビゲーションプロパティがロードされているとはマークされません(遅延読み込みを有効にしてプロパティへの次回のアクセスで遅延ロードがトリガーされ、他のすべてのエンティティが読み込まれます)。

+0

あなたのご意見ありがとうございます。残念ながらまだありません:最初の提案では、newElement.ElementToComponentMappingsプロパティはどこに設定されますか? 2番目の提案では、ElementToComponentMappingsにFirstOrDefaultの定義が含まれていないというエラーが発生し、最適な拡張メソッドオーバーロードに無効な引数が含まれています。型の違いについては、ElementToComponentMappingsがコレクションであることは間違いありません。つまり、ある時点でToListを呼び出す必要がありますか? –

+0

最初の場合、それはトリックです。すべてが正しく設定されていれば、そのプロパティを設定する必要はありません。自動的に入力されます。 2番目のケースでは、それは不思議です。 'CreateSourceQuery'は' IQueryable'の実装である 'ObjectQuery'を返し、' FirstOrDefault'を提供します。 'ToList'でのあなたのやり方は、エンティティがプロキシされていない場合にのみ機能します。そうしないと、新しいコレクションをナビゲーションプロパティに割り当てることができないといういくつかのエラーが発生します。便利なヒント、トリック、洞察力については –

+0

+1結局、私はこのアプローチを働かせることができなかったので、別のやり方でした。 –

関連する問題