实体框架4 - 什么是用于连接2个表然后寻呼他们的语法?

问题描述 投票:25回答:4

我有以下的LINQ到实体查询与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;

我知道我需要使用。加入()扩展方法,然后调用.OrderBy()跳过()。以()来做到这一点,我只是流汗绊倒在加入(语法),似乎并不能找到任何实例(网上或书)。

注:我连接表的原因是做了排序。如果有更好的方法基于相关表中加入比的值进行排序,请包括它在你的答案。

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

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

荣誉对Khumesh和普拉与此帮助。由于其余的贡献。

linq join linq-to-entities pagination
4个回答
4
投票

下面一行添加到您的查询

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

数据变量是IQueryable的,所以你可以把添加跳跃和采取的方法就可以了。如果你有产品和变异之间的关系,你DONOT确实需要有明确的加盟,您可以参阅变种是这样的

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

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

1
投票

我的回答此基础上标记为真正的答案,但在这里我添加上面的代码的一个新的最佳实践

    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)

这是使用LINQ到实体的最佳做法,因为当你添加AsQueryable已()到你的代码;系统将通用System.Collections.Generic.IEnumerable转换为通用System.Linq.IQueryable这是净引擎更好地建设在运行时此查询

谢谢Khumesh Kumawat先生


0
投票

你会简单地使用你Skip(itemsInPage * pageNo).Take(itemsInPage)做分页。

© www.soinside.com 2019 - 2024. All rights reserved.