wake-up-neo.com

Entity Framework 4 - Wie lautet die Syntax für das Zusammenfügen von 2 Tabellen und das Paging?

Ich habe die folgende Linq-to-Entities-Abfrage mit 2 verbundenen Tabellen, denen ich die Paginierung hinzufügen möchte:

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;

Ich erkenne, dass ich die Erweiterungsmethode .Join () verwenden muss und dann .OrderBy (). Skip (). Take () benutze, um dies zu tun. Ich werde nur mit der Syntax von Join () in Berührung gebracht und kann nicht scheinen um Beispiele zu finden (entweder online oder in Büchern).

HINWEIS: Der Grund, warum ich mich den Tabellen anschlage, ist das Sortieren. Wenn es eine bessere Möglichkeit gibt, anhand eines Werts in einer verknüpften Tabelle zu sortieren als einen Join, geben Sie dies bitte in Ihre Antwort ein.

2 Mögliche Lösungen

Ich denke, dies ist nur eine Frage der Lesbarkeit, aber beide funktionieren und sind semantisch identisch.

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

Ein großes Lob an Khumesh und Pravin für die Hilfe. Vielen Dank für den Beitrag.

25
NightOwl888

Fügen Sie Ihrer Abfrage die folgende Zeile hinzu

var pagedQuery = data.Skip(PageIndex * PageSize).Take(PageSize); 

Die Datenvariable ist IQueryable, daher können Sie die add-Methode überspringen. Und wenn Sie eine Beziehung zwischen Produkt und Variante haben, brauchen Sie nicht unbedingt eine explizite Verknüpfung

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

Definieren Sie den Join in Ihrem Mapping und verwenden Sie ihn. Sie erhalten wirklich nichts mit der Join-Methode - stattdessen verwenden Sie die Include-Methode. Es ist viel schöner.

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

Meine Antwort hier basiert auf der Antwort, die als wahr markiert ist Aber hier füge ich eine neue Best Practice des obigen Codes hinzu 

    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)

dies ist die bewährte Methode für die Verwendung der Linq-Entität, wenn Sie Ihrem Code AsQueryable () hinzufügen. Das System konvertiert ein generisches System.Collections.Generic.IEnumerable in ein generisches System.Linq.IQueryable. Dies ist besser für die .Net-Engine, um diese Abfrage zur Laufzeit zu erstellen

vielen Dank, Herr Khumesh Kumawat

1
Ahmad Hindash

Sie würden einfach Ihre Skip(itemsInPage * pageNo).Take(itemsInPage) verwenden, um das Paging durchzuführen.

0
sacha