我有一个带有树结构的Category表(Id,MasterId) 我想选择属于某个类别和所有子类别的所有产品。
今天我使用这个有效的SQL查询,但我想添加分页,使用纯LINQ查询会更容易。我使用Entity Framework 4。
@Count int = 100,
@CategoryId int
with mq as
(
select c.Id as parent, c.Id as child
from dbo.Categories c
where c.Id = @CategoryId
union all
select q.child, c.Id
from mq q
inner join dbo.Categories c on q.child = c.MasterId
)
select top (@Count) P.* from Products P
inner join ProductToCategory PC ON(PC.ProductId = P.Id)
where PC.CategoryId in (
select child from mq
)
and P.PublishStatus = 1
order by P.PublishedDate DESC;
如何通过分页(当前页面,每页产品数量,总产品数量)获得一个漂亮的LINQ查询?
答案 0 :(得分:1)
这是带表表达式的递归/层次查询。 EF不提供此类查询的支持。如果要通过单向往返DB接收数据,则必须将其包装在存储过程中并将该过程导入实体框架模型。
时,也可以在SQL中进行分页答案 1 :(得分:0)
有一个想法。我没有测试过,所以如果它不起作用就不要责怪:P
var ids = context.TreeItems.Where(x => x.Id == parentId).Select(x => (int?)x.Id);
var tmp = ids;
while (true)
{
IQueryable<int?> localIds = tmp;
var subIds = context.TreeItems.Where(x => ids.Contains(x.ParentId)).Select(x => (int?)x.Id);
if (subIds.Any())
{
tmp = subIds;
ids = ids.Union(subIds);
}
else
break;
}
var allSubItems = context.TreeItems.Where(x => ids.Contains(x.Id));