今天使用EF core 做分页查询的时候遇到的
首先是表
分页查询的代码:
public PageResult<OrderVO> pageQuery(int pageIndex, int pageSize, string? bookName, long? categoryId, string? username)
{
var query = from order in ctx.Orders
join user in ctx.Users on order.userId equals user.id
join address in ctx.Addresses on order.addressId equals address.id
where (username == null || user.username.Contains(username))
let matchingItems = ctx.OrderItems
//.Where(i => i.orderId == order.id && ctx.Books.Any(b => b.id == i.bookId &&
//(bookName == null || b.name.Contains(bookName) && (categoryId == null || b.categoryId == categoryId)))).ToList()
.Where(i => i.orderId == order.id)
.Where(i => (bookName == null || ctx.Books.Any(b => b.id == i.bookId && b.name.Contains(bookName))) &&
(categoryId == null || ctx.Books.Any(b => b.id == i.bookId && b.categoryId == categoryId))).ToList()
where matchingItems.Any()
select new OrderVO
{
id = order.id,
userId = order.userId,
addressId = order.addressId,
total = order.total,
createTime = order.createTime,
phone = address.phone,
username = user.username,
detail = address.detail,
items = ctx.OrderItems.Where(i => i.orderId == order.id).ToList(),
receiver = address.name
};
PageResult <OrderVO> pageResult = new PageResult<OrderVO>();
pageResult.list = query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
pageResult.total = query.Count();
return pageResult;
}
情况是,当传入的参数为 pageIndex=1, pageSize=10, bookName=null, categoryId=2, username=null时
使用上面被注释掉的代码查询,会导致包含 categoryId=1的item 的order不被过滤掉
而用现在的代码,却可以过滤掉
两个代码看起来差不多,但是结果却有区别,是什么原因呢?求解答