Entity Framework 4 - What is the syntax for joining 2 tables then paging them?

后端 未结 4 1980
遇见更好的自我
遇见更好的自我 2021-02-03 22:54

I have the following linq-to-entities query with 2 joined tables that I would like to add pagination to:

IQueryable data = from inventory         


        
相关标签:
4条回答
  • 2021-02-03 23:38

    My answer here based on the answer that is marked as true but here I add a new best practice of the code above

        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)
    

    this is the best practice to use the Linq to entity because when you add AsQueryable() to your code; system will converts a generic System.Collections.Generic.IEnumerable to a generic System.Linq.IQueryable which is better for .Net engine to build this query at run time

    thank you Mr. Khumesh Kumawat

    0 讨论(0)
  • 2021-02-03 23:39

    Define the join in your mapping, and then use it. You really don't get anything by using the Join method - instead, use the Include method. It's much nicer.

    var data = objContext.ProductInventory.Include("Variant")
                   .Where(i => i.ProductId == productId && i.StoreId == storeId)
                   .OrderBy(j => j.Variant.SortOrder)
                   .Skip(x)
                   .Take(y);
    
    0 讨论(0)
  • 2021-02-03 23:52

    You would simply use your Skip(itemsInPage * pageNo).Take(itemsInPage) to do paging.

    0 讨论(0)
  • 2021-02-03 23:57

    Add following line to your query

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

    The data variable is IQueryable, so you can put add skip & take method on it. And if you have relationship between Product & Variant, you donot really require to have join explicitly, you can refer the variant something like this

    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); 
    
    0 讨论(0)
提交回复
热议问题