4

3 つのテーブルがあり、そのうちの 2 つは多対多の関係にあります。

写真:

ここに画像の説明を入力

これは、中央の mm テーブルのデータです。

ここに画像の説明を入力

編集: ここまで来て、適切な4行が返されましたが、それらはすべて同じ結果です(4行が必要であることはわかっていますが、結果は異なります)

    return this._mediaBugEntityDB.LotteryOffers
        .Find(lotteryOfferId).LotteryDrawDates
        .Join(this._mediaBugEntityDB.Lotteries, ldd => ldd.LotteryId, lot => lot.Id, (ldd, lot) =>
            new Lottery
            {
                Name = lot.Name,
                CreatedBy = lot.CreatedBy,
                ModifiedOn = lot.ModifiedOn
            }).AsQueryable();

私の質問は、LotteryOfferId のみが与えられている多対多のテーブルを介してすべての宝くじを取得するにはどうすればよいですか?

私が達成したいのは、LotteryDrawDateId によって宝くじテーブルからデータを取得することです。

最初に LotteryOfferId を使用して中央のテーブルから DrawDates を取得し、中央のテーブルで drawDateIds を取得して LotteryDrawDate テーブルで使用します。そのテーブルから、LotteryDrawDate テーブルの LotteryId で Lottey テーブルを取得する必要があります。

私は通常の SQL でこれを取得します (LotteryOffersLotteryDrawDates は DB の中間テーブルであり、モデルには表示されません):

名前、Lotteries.CreatedBy、Lotteries.ModifiedOn、count(Lotteries.Id) を Lotteries の TotalDrawDates として選択 Lotteries.Id = LotteryDrawDates.LotteryId で LotteryOffersLotteryDates に参加 LotteryDrawDates.Id = LotteryOffersLotteryDrawDates.LotteryDrawDate_Id で LotteryOffersLotteryDrawDates. = LotteryOffersLotteryDrawDates.1 、Lotteries.CreatedBy、Lotteries.ModifiedOn

しかし、Linqは別の話です:P

ラムダ式でこれを行いたいと思います。ありがとう

4

2 に答える 2

3
db.LotteryOffer.Where(lo => lo.Id == <lotteryOfferId>)
    .SelectMany(lo => lo.LotteryDrawDates)
    .Select( ldd => ldd.Lottery )
    .GroupBy( l => new { l.Name, l.CreatedBy, l.ModifiedOn } )
    .Select( g => new
    {
        g.Key.Name,
        g.Key.CreatedBy,
        g.Key.ModifiedOn,
        TotalDrawDates = g.Count()
    } );
于 2013-10-19T15:08:37.610 に答える
1

あなたはこれを行うことができます:

var query = from lo in this._mediaBugEntityDB.LotteryOffers
            where lo.lotteryOfferId == lotteryOfferId
            from ld in lo.LotteryDrawDates
            group ld by ld.Lottery into grp
            select grp.Key;

(私の意見では)何が起こるかを簡単に確認できるため、クエリ構文でこれを行います。重要な点は、 によるグループ化です。これは、同じ を持つことができるLotteryいくつかのものが取得されるためです。LotteryDrawDatesLottery

LotteryDrawDatesperのカウントを表示したい場合はLottery、別のアプローチを取ることをお勧めします。

from lot in this._mediaBugEntityDB.Lotteries.Include(x => x.LotteryDrawDates)
where lot.LotteryDrawDates
         .Any(ld => ld.LotteryDrawDates
                      .Any(lo => lo.lotteryOfferId == lotteryOfferId))
select lot

コレクションがロードされた状態でLotteryオブジェクトを取得するようになったので、その後は遅延ロード例外なしでアクセスできます。LotteryDrawDateslottery.LotteryDrawDates.Count()

于 2013-10-19T19:16:21.270 に答える