4

我有三个表,其中两个是多对多关系。

图片:

在此处输入图像描述

这是中间 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 中的中间表,在模型中看不到):

选择 Name, Lotteries.CreatedBy, Lotteries.ModifiedOn, count(Lotteries.Id) as TotalDrawDates from Lotteries join LotteryDrawDates on Lottery.Id = LotteryDrawDates.LotteryId join LotteryOffersLotteryDrawDates on LotteryDrawDates.Id = LotteryOffersLotteryDrawDates.LotteryDrawDate_Id 其中 LotteryOffersLotteryDrawDate9 group by LotteryOffersLotteryDrawDates = LotteryDrawDates。 , Lotteries.CreatedBy, Lotteries.ModifiedOn

但是 Linq 是不同的故事:P

我想用 lambda 表达式来做到这一点。谢谢

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,因为你得到的LotteryDrawDates任何一个都可以有相同的数目Lottery

如果要显示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了集合的对象LotteryDrawDates,因此之后您可以访问lottery.LotteryDrawDates.Count()而不会出现延迟加载异常。

于 2013-10-19T19:16:21.270 回答