26

ページネーションを追加したい2つの結合テーブルを含む次のlinq-to-entitiesクエリがあります。

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;

これを行うには、.Join() 拡張メソッドを使用してから .OrderBy().Skip().Take() を呼び出す必要があることに気付きました。例を見つけるには(オンラインまたは書籍で)。

注:テーブルを結合する理由は、並べ替えを行うためです。関連するテーブルの値に基づいて並べ替えるには、結合するよりも良い方法がある場合は、それを回答に含めてください。

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 と Pravin に感謝します。貢献してくれてありがとう。

4

4 に答える 4

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);
于 2012-04-19T06:20:40.990 に答える
5

次の行をクエリに追加します

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

data 変数は IQueryable なので、 add skip & take メソッドを入れることができます。また、製品とバリアントの間に関係がある場合、明示的に結合する必要はありません。バリアントを次のように参照できます。

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); 
于 2012-04-19T06:02:32.780 に答える
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)

コードに AsQueryable() を追加すると、Linq to エンティティを使用するのがベスト プラクティスになります。system は、汎用 System.Collections.Generic.IEnumerable を汎用 System.Linq.IQueryable に変換します。これは、.Net エンジンが実行時にこのクエリを構築するのに適しています。

クメシュ・クマワット氏に感謝します

于 2013-11-03T15:42:04.543 に答える
0

Skip(itemsInPage * pageNo).Take(itemsInPage)ページングを行うには、単にあなたを使用します。

于 2012-04-19T05:56:27.913 に答える