0

これが私のテーブル構造です

場所

  • PlaceId PK
  • 名前
  • ..。

PlaceCategories

  • CatId PK
  • 名前
  • ..。

PlaceCats

  • PlaceId PK
  • CatId PK

カテゴリID(テーブル結合)に基づいてプレイスをプルするクエリは次のとおりです

public static IQueryable<Places> ByPlaceCat(this Table<Places> table, Expression<Func<PlaceCats, bool>> predicate) {
    var db = (DataContext)table.Context;
    var innerBizBase = db.PlaceCats.Where(predicate);
    return db.Places.Join(innerBizBase, a => a.PlaceId, ab => ab.PlaceId, (a, ab) => a);
}

私はそれを次のように使用します:

places = Db.Places.ByPlaceCat(a => a.CatId == 5);

List<int>しかし、カテゴリIDのに基づいてプルできるようにしたいと思います。生成されたPLINQOコードを見ると、複数のPlaceIdをプルする(ただし、結合されたテーブルを使用しない)クエリは次のようになります。

public static IQueryable<Places> ByPlaceId(this IQueryable<Places> queryable, IEnumerable<long> values)
{
    return queryable.Where(p => values.Contains(p.PlaceId));
}

これらの2つのクエリを基本的にマージして、List<int>クエリするCatIdを渡すにはどうすればよいですか?このLINQ/PLINQOクエリは、私の脳を溶かしています。前もって感謝します!

4

1 に答える 1

3

次のような拡張メソッドを作成する必要があります。

    public static IQueryable<Places> ByPlaceCats(this Table<Places> table, IEnumerable<int> catIds)
    {
        var db = (TestDataContext)table.Context;
        var places = (from placeCat in db.PlaceCats
                      join place in db.Places on placeCat.PlaceId equals place.PlaceId
                      where catIds.Contains(placeCat.CatId)
                      select place);
        return places;
    }

適切なテーブルに2つの外部キーを追加することで、PlaceCatsテーブルをManyToMany関係にすることができることに注意してください。この変更が行われると、 PLINQOは自動的に正しいコードを生成し、中間テーブルをスキップして2つのテーブル間にリンクを作成します。したがって、Placesエンティティのプロパティにアクセスすることで、現在のPlacesエンティティに関連付けられているPlaceCategoriesのコレクションを取得できます。

ご不明な点がございましたら、お気軽にお問い合わせください。ここにあるコミュニティフォーラムとここにあるPLINQOフォーラムを必ずチェックください

ありがとう-BlakeNiemyjski(CodeSmith Support)

于 2011-03-23T18:04:23.430 に答える