实体框架4 - 连接2个表然后分页它们的语法是什么?

Nig*_*888 26 linq pagination linq-to-entities join

我有以下linq-to-entities查询与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;
Run Code Online (Sandbox Code Playgroud)

我意识到我需要使用.Join()扩展方法,然后调用.OrderBy().跳过().Take()执行此操作,我只是绊倒了Join()的语法,似乎无法找到任何例子(在线或书籍).

注意:我加入表格的原因是进行排序.如果有更好的方法根据相关表中的值而不是连接进行排序,请将其包含在您的答案中.

2可能的解决方案

我想这只是一个可读性的问题,但这两个都可以工作,并且在语义上是相同的.

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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

感谢Khumesh和Pravin帮助解决这个问题.感谢其他人的贡献.

Kir*_*rst 8

在映射中定义连接,然后使用它.你真的没有通过使用该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);
Run Code Online (Sandbox Code Playgroud)


Pra*_*war 5

在查询中添加以下行

var pagedQuery = data.Skip(PageIndex * PageSize).Take(PageSize); 
Run Code Online (Sandbox Code Playgroud)

数据变量是IQueryable,因此您可以在其上添加skip skip&take方法.如果你在Product&Variant之间有关系,你真的没有明确要求加入,你可以参考像这样的变体

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); 
Run Code Online (Sandbox Code Playgroud)