5

Code First アプローチで Entity Framework 4.3.1 を使用しています。また、PredicateBuilder を使用するために LinqKit を使用しています。

次のようなテーブルがある場合:

場所、タイムゾーン (多:1)

..そして、私は次のようなものが欲しいです:

Expression<Func<TimeZone, bool>> pred = PredicateBuilder.True<TimeZone>();
pred = pred.And(tz => tz.TimeZoneCode == "EST");

List<Location> locations = context.Locations
    .AsExpandable().Where(pred)
    .Select(loc => loc).ToList();

述語は TimeZone を受け入れるように構築されていますが、Wh​​ere() メソッドは Location を受け取るため、これは機能しません。

このように述語を書き直すことはできますが、特定の型の述語を作成する述語ファクトリが必要なため、そうしたくありません (この方法で Navigator プロパティを使用したくありません)。

Expression<Func<Location, bool>> pred = PredicateBuilder.True<Location>();
pred = pred.And(loc => loc.TimeZone.TimeZoneCode == "EST");

Location を取得してナビゲーション プロパティを介してツリーをたどる (これは再利用性が低いため) のではなく、TimeZone を取得する最初の例で構築された述語を使用するために、(もしあれば) どの構文を使用できますか? そもそも EF がナビゲーション プロパティについて持っている知識を活用し、ナビゲーション プロパティの型にスコープが設定された述語を使用できる方法があればいいのですが。

4

2 に答える 2

6

約1週間の苦労の末、実際にこれができることがわかりました. 手順は次のとおりです。

  1. 内部プロパティのクエリである Predicate を定義します ( subPredicate)
  2. Invoke親オブジェクトのプロパティに対して、別の述語 ( )内subPredicateから。predicate
  3. Expandあなたの句predicateでそれを使用するとき。Where

あなたの例の修正されたコードは次のとおりです。

var subPredicate = PredicateBuilder.True<TimeZone>();
subPredicate = subPredicate.And(tz => tz.TimeZoneCode == "EST");

var predicate = PredicateBuilder.True<Location>();
predicate = predicate.And(l => subPredicate.Invoke(l.TimeZone));

List<Location> locations = context.Locations
    .AsExpandable().Where(pred.Expand())
    .Select(loc => loc).ToList();
于 2015-01-27T15:02:26.810 に答える
2

これを更新するだけです。これらの種類の述語の意図は、主エンティティをフィルタリングすることです。精神的な概念は次のとおりです。どのエンティティを返したいかを決定し、それらを返します。EF は、子エンティティに対するこの種の深い述語アプリケーション用に設計されていないようです。

ある人 (場所は覚えていません) が素晴らしい点を指摘しました。したがって、たとえば、Invoice エンティティがあるのは意味がありませんが、Invoice Lines の半分だけです。

私が達成したかったのは、EXISTS() または IN() の行に沿って、「製品タイプ 'Nuts' および 'Bolts' の請求明細行があるすべての請求書をください」と言うことができるものでした。これは実現可能ですが、LINQ を適用するか、独自のオブジェクトを構成する必要がある場合があります。既定の EF の目的は、請求書を渡すことです。その後、請求明細行を遅延または積極的に読み込むことができますが、データベースから直接フィルターとして使用することはできません。

近いものを達成するために私が見たいくつかの構造がありますが、構文はすぐに非常に扱いにくくなります。

市役所と争うな。

于 2012-09-26T14:53:37.653 に答える