0

最新の安定した NHibernate を使用して、次のクエリがあります。

   private void Index(PromotionsRequest req)
    {
        PropertyBag["CurrentYear"] = DateTime.Today.Year;
        PropertyBag["CurrentManager"] = CurrentManager;
        IQueryable<Promotion> promotions;
        int totalPromotions;
        if (req.Commited)
            totalPromotions = NHibernateSession.Query<CommitedPromotion>().Where(p => p.IsHead == true).Count();
        else
            totalPromotions = NHibernateSession.Query<StagedPromotion>().Where(p => p.IsHead == true).Count();
        var totalPages = totalPromotions / maxpages;
        if (totalPages == 0)
            totalPages = 1;
        if (0 == totalPromotions % maxpages)
            totalPages++;
        var currentpage = req.Page;
        var numbers = new List<int>();
        for (int i = 1; i <= totalPages; i++)
            numbers.Add(i);
        var chunkednumbers = Chunk(numbers, maxpages);
        numbers = chunkednumbers.Single(p => p.Contains(currentpage)).ToList();
        if (req.Commited)
            promotions = NHibernateSession.Query<CommitedPromotion>().Where(p => p.IsHead == true).Cast<Promotion>();
        else
            promotions = NHibernateSession.Query<StagedPromotion>().Where(p => p.IsHead == true).Cast<Promotion>();
        //
        if (req.Status == Status.Active)
        {
            promotions = promotions.Where(p => p.From < DateTime.Now && p.To > DateTime.Now);
        }
        else
            if (req.Status == Status.Expired)
            {
                promotions = promotions.Where(p => p.To < DateTime.Now);
            }
            else
                if (req.Status == Status.Unstarted)
                {
                    promotions = promotions.Where(p => p.From > DateTime.Now);
                }
        //
        if (req.Commited)
        {
            if (req.Sort == Sort.Newest)
            {
                promotions = promotions.OrderBy(p => p.Created);
            }
            else
                if (req.Sort == Sort.Newest)
                {
                    promotions = promotions.OrderByDescending(p => p.Created);
                }
                else
                    if (req.Sort == Sort.Modified)
                    {
                        promotions = promotions.OrderBy(p => p.Modified);
                    }
        }
        //
        promotions = promotions
              .Skip(itemsperpage * (currentpage - 1))
              .Take(itemsperpage);
        var promotionsCreated = NHibernateSession.Query<Manager>().Select(p => p.PromotionsCreated).Sum();

        PropertyBag["PromotionsResponse"] = this.listbinder.GetListOfPromotionsFrom(promotions, currentpage, totalPages, totalPromotions, promotionsCreated, req.Sort, req.Status, numbers);
    }

このクエリは、req.Commited が true であるかどうかに応じて、CommitedPromotion タイプまたは StagedPromotion タイプのインスタンスを取得します。基本クラスである Promotion には IsHead というプロパティがあり、これを使用してそれらをフィルター処理します。この場合、IsHead == true を持つプロモーションのみが必要です。問題?このクエリは IsHead == false のものも返します。私の知る限り、それはあってはならないことです。これは、Status および Sort 列挙型でフィルタリングを開始した時点で発生します。

  if (req.Sort == Sort.Newest)
                {
                    promotions = promotions.OrderBy(p => p.Created);
                }

ここでデバッグすると、IsHead == false で昇格することがわかります。

4

1 に答える 1

0

IsHead == trueコミットされていないプロモーションに対してのみフィルタリングされるため、コミットされたプロモーションはIsHead = false

私が見る他の問題

  • 2番目if (req.Sort == Sort.Newest)はSort.Oldesでなければなりません
于 2013-03-15T07:40:04.700 に答える