J'ai la requête linq-to-entity suivante avec 2 tables jointes que je voudrais ajouter à la pagination:
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;
Je me rends compte que je dois utiliser la méthode d'extension .Join () puis appeler .OrderBy (). Skip (). Take (). Pour ce faire, je suis en train de commencer à tricher sur la syntaxe de Join () et je ne peux pour trouver des exemples (en ligne ou dans des livres).
NOTE: La raison pour laquelle je rejoins les tables est de faire le tri. S'il existe un meilleur moyen de trier en fonction d'une valeur dans une table liée que de rejoindre, veuillez l'inclure dans votre réponse.
2 solutions possibles
Je suppose que celui-ci est juste une question de lisibilité, mais les deux fonctionneront et sont sémantiquement identiques.
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);
Félicitations à Khumesh et à Pravin pour leur aide. Merci au reste pour sa contribution.
Ajouter la ligne suivante à votre requête
var pagedQuery = data.Skip(PageIndex * PageSize).Take(PageSize);
La variable data est IQueryable, vous pouvez donc y appliquer la méthode add skip & take. Et si vous avez une relation entre Produit et Variant, vous n’avez pas vraiment besoin d’avoir explicitement adhéré, vous pouvez faire référence à la variante quelque chose comme ceci
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);
Définissez la jointure dans votre mappage, puis utilisez-la. Vous n'obtenez vraiment rien en utilisant la méthode Join
; utilisez plutôt la méthode Include
. C'est beaucoup mieux.
var data = objContext.ProductInventory.Include("Variant")
.Where(i => i.ProductId == productId && i.StoreId == storeId)
.OrderBy(j => j.Variant.SortOrder)
.Skip(x)
.Take(y);
Ma réponse ici basée sur la réponse marquée comme étant vraie Mais j'ajoute ici une nouvelle meilleure pratique du code ci-dessus
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)
il est recommandé d’utiliser l’entité Linq to, car vous ajoutez AsQueryable () à votre code. system convertira un System.Collections.Generic.IEnumerable générique en un System.Linq.IQueryable générique, ce qui est préférable pour le moteur .Net pour générer cette requête au moment de l'exécution
merci M. Khumesh Kumawat
Vous utiliseriez simplement votre Skip(itemsInPage * pageNo).Take(itemsInPage)
pour faire de la pagination.