带有多个子句的NHibernate Linq获取不需要的数据
本文关键字:Linq 获取 不需要 数据 NHibernate 子句 | 更新日期: 2023-09-27 18:03:54
使用最新的稳定的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。committed是否为真,获取CommitedPromotion类型或StagedPromotion类型的实例。基类Promotion有一个属性IsHead,我用它来过滤它们。在本例中,我只需要具有IsHead == true的促销。这个问题?该查询甚至返回那些IsHead == false的查询。据我所知,这不应该发生。这发生在我开始按Status和Sort枚举进行过滤的地方:
if (req.Sort == Sort.Newest)
{
promotions = promotions.OrderBy(p => p.Created);
}
如果我在这里调试,我看到它得到提升与IsHead == false。
IsHead == true
仅对未提交的促销进行过滤,因此已提交的促销可以有IsHead = false
我看到的其他问题
- 第二个
if (req.Sort == Sort.Newest)
应该是Sort。老