2012-05-09 8 views
1

一連のナビゲーションチェーンで選択された要素を制限しようとしています。ここではシーケンスはおおよそです: 注文 - >プリファレンス(S) - > PreferenceCard - >項目(複数可) - > OrderItemのエンティティフレームワーク3 - チェーンされたナビゲーションプロパティの要素のフィルタ

注:

  • ためには、複数の嗜好を持つことができます。
  • 優先度は1優先度カードです。
  • 設定カードはアイテムで構成されています。
  • OrderItemには、注文に固有のそのアイテムに関する詳細が含まれています。

OrderItemsの選択を、注文にリンクされているもののみに制限するにはどうすればよいですか?私のInclude("Preference.PreferenceCard.Item.OrderItem")はOrderに対応していなくても、すべてのOrderItemを取得します。

私はWhere()句を試してみたが、何もしていないようだ。

.Where(
    o => o.Preference.Any(
     p => p.PreferenceCard.Items.Any(
      item => item.OrderItem.Any(
       orderItem => orderItem.OrderId == o.OrderId)))) 

どのようにしても適切なナビゲーションプロパティを使用してチェーンOrderIdででのOrderItemsをフィルタリングすることができますか?

答えて

0

これらのタイプの問題の混乱の主な原因は、EntityFrameworkのエンティティが通常のクラスとは異なることを理解することだと思います。データ構造やそのナビゲーションプロパティ(追加、変更、削除)を操作したくない場合は、匿名型やPOCO(旧来のCLRオブジェクト)。独自のクラスを宣言し、それに応じてプロパティを割り当てることができます。

public class OrderView 
{ 
    public int Id { get; set; } 
    public IEnumerable<OrderItem> OrderItems { get; set; } 
    ... 
} 

var query = from o in context.Orders 
      select new OrderView 
      { 
       Id = o.Id, 
       OrderItems = //custom filtering 
       ... 
      }; 
+0

このデータは操作されるため、パフォーマンス上の理由からメモリ内のオブジェクトをフィルタ処理したくありません。要素をフィルタリングする方法はありませんか? – strongriley

+0

@strongriley - 私はあなたがメモリ内の要素をフィルタリングすることを示唆していません。 EntityFrameworkでは、エンティティナビゲーションプロパティをフィルタリングすることは、それらの項目を削除することと同じです。エンティティがNavigationalプロパティのほんの一部しか持たない場合、どのようにデータを操作しますか? – Aducci

+0

ガイダンスをありがとう - OrderItemsをOrderから直接取り出し、繰り返してPreferenceCard/Itemsに戻していきました。 – strongriley

関連する問題