web-dev-qa-db-fra.com

Entity Framework 4 - Quelle est la syntaxe pour joindre 2 tables puis les paginer?

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.

1

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);

2

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.

25
NightOwl888

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); 
5
Pravin Pawar

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);
8
Kirk Broadhurst

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

1
Ahmad Hindash

Vous utiliseriez simplement votre Skip(itemsInPage * pageNo).Take(itemsInPage) pour faire de la pagination.

0
sacha