web-dev-qa-db-ja.com

Entity Framework 4-2つのテーブルを結合してページングするための構文は何ですか?

私は、ページネーションを追加したい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()を呼び出してこれを行う必要があることを認識していますが、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);

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に称賛を送ります。貢献してくれてありがとう。

26
NightOwl888

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

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

データ変数は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); 
4
Pravin Pawar

マッピングで結合を定義してから使用します。 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);
8
Kirk Broadhurst

ここでの答えはtrueとマークされている答えに基づいていますが、ここでは上記のコードの新しいベストプラクティスを追加します

    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 entityを使用するベストプラクティスです。システムは、ジェネリックSystem.Collections.Generic.IEnumerableをジェネリックSystem.Linq.IQueryableに変換します。これは、.Netエンジンが実行時にこのクエリを構築するのに適しています

クメシュ・クマワットさん、ありがとうございます

1
Ahmad Hindash

Skip(itemsInPage * pageNo).Take(itemsInPage)を使用してページングを行うだけです。

0
sacha