私は、ページネーションを追加したい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つの可能な解決策
これは読みやすさだけの問題だと思いますが、これらは両方とも機能し、意味的には同じです。
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);
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に称賛を送ります。貢献してくれてありがとう。
クエリに次の行を追加します
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);
マッピングで結合を定義してから使用します。 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);
ここでの答えは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エンジンが実行時にこのクエリを構築するのに適しています
クメシュ・クマワットさん、ありがとうございます
Skip(itemsInPage * pageNo).Take(itemsInPage)
を使用してページングを行うだけです。