Nig*_*888 26 linq pagination linq-to-entities join
我有以下linq-to-entities查询与2个连接表,我想添加分页:
IQueryable<ProductInventory> data = from inventory in objContext.ProductInventory
join variant in objContext.Variants
on inventory.VariantId equals variant.id
where inventory.ProductId == productId
where inventory.StoreId == storeId
orderby variant.SortOrder
select inventory;
Run Code Online (Sandbox Code Playgroud)
我意识到我需要使用.Join()扩展方法,然后调用.OrderBy().跳过().Take()执行此操作,我只是绊倒了Join()的语法,似乎无法找到任何例子(在线或书籍).
注意:我加入表格的原因是进行排序.如果有更好的方法根据相关表中的值而不是连接进行排序,请将其包含在您的答案中.
2可能的解决方案
我想这只是一个可读性的问题,但这两个都可以工作,并且在语义上是相同的.
IQueryable<ProductInventory> data = objContext.ProductInventory
.Where(y => y.ProductId == productId)
.Where(y => y.StoreId == storeId)
.Join(objContext.Variants,
pi => pi.VariantId,
v => v.id,
(pi, v) => new { Inventory = pi, Variant = v })
.OrderBy(y => y.Variant.SortOrder)
.Skip(skip)
.Take(take)
.Select(x => x.Inventory);
Run Code Online (Sandbox Code Playgroud)
var query = from inventory in objContext.ProductInventory
where inventory.ProductId == productId
where inventory.StoreId == storeId
join variant in objContext.Variants
on inventory.VariantId equals variant.id
orderby variant.SortOrder
select inventory;
var paged = query.Skip(skip).Take(take);
Run Code Online (Sandbox Code Playgroud)
感谢Khumesh和Pravin帮助解决这个问题.感谢其他人的贡献.
在映射中定义连接,然后使用它.你真的没有通过使用该Join方法获得任何东西- 而是使用该Include方法.它更好.
var data = objContext.ProductInventory.Include("Variant")
.Where(i => i.ProductId == productId && i.StoreId == storeId)
.OrderBy(j => j.Variant.SortOrder)
.Skip(x)
.Take(y);
Run Code Online (Sandbox Code Playgroud)
在查询中添加以下行
var pagedQuery = data.Skip(PageIndex * PageSize).Take(PageSize);
Run Code Online (Sandbox Code Playgroud)
数据变量是IQueryable,因此您可以在其上添加skip skip&take方法.如果你在Product&Variant之间有关系,你真的没有明确要求加入,你可以参考像这样的变体
IQueryable<ProductInventory> data =
from inventory in objContext.ProductInventory
where inventory.ProductId == productId && inventory.StoreId == storeId
orderby inventory.variant.SortOrder
select new()
{
property1 = inventory.Variant.VariantId,
//rest of the properties go here
}
pagedQuery = data.Skip(PageIndex * PageSize).Take(PageSize);
Run Code Online (Sandbox Code Playgroud)