最新の安定した 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 で昇格することがわかります。