我有以下的LINQ到实体查询与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;
我知道我需要使用。加入()扩展方法,然后调用.OrderBy()跳过()。以()来做到这一点,我只是流汗绊倒在加入(语法),似乎并不能找到任何实例(网上或书)。
注:我连接表的原因是做了排序。如果有更好的方法基于相关表中加入比的值进行排序,请包括它在你的答案。
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);
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);
荣誉对Khumesh和普拉与此帮助。由于其余的贡献。
下面一行添加到您的查询
var pagedQuery = data.Skip(PageIndex * PageSize).Take(PageSize);
数据变量是IQueryable的,所以你可以把添加跳跃和采取的方法就可以了。如果你有产品和变异之间的关系,你DONOT确实需要有明确的加盟,您可以参阅变种是这样的
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);
定义你的映射加入,然后使用它。你真的不使用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);
我的回答此基础上标记为真正的答案,但在这里我添加上面的代码的一个新的最佳实践
var data= (from c in db.Categorie.AsQueryable().Join(db.CategoryMap,
cat=> cat.CategoryId, catmap => catmap.ChildCategoryId,
cat, catmap) => new { Category = cat, CategoryMap = catmap })
select (c => c.Category)
这是使用LINQ到实体的最佳做法,因为当你添加AsQueryable已()到你的代码;系统将通用System.Collections.Generic.IEnumerable转换为通用System.Linq.IQueryable这是净引擎更好地建设在运行时此查询
谢谢Khumesh Kumawat先生
你会简单地使用你Skip(itemsInPage * pageNo).Take(itemsInPage)
做分页。