Entity Framework 4 - Что такое синтаксис для объединения двух таблиц, а затем их подкачки?
У меня есть следующий запрос linq-to-entity с двумя объединенными таблицами, к которым я хотел бы добавить нумерацию страниц:
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);
Слава Хумешу и Правину за помощь в этом. Спасибо остальным за помощь.
Ответы
Ответ 1
Добавьте в свой запрос следующую строку
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);
Ответ 2
Определите соединение в вашем сопоставлении, а затем используйте его. Вы действительно ничего не получаете, используя метод 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);
Ответ 3
Мой ответ здесь, основываясь на ответе, который отмечен как истинный
но здесь я добавляю новую лучшую практику кода выше
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, который лучше для .Net-механизма для создания этого запроса во время выполнения
Благодарю вас, г-н Хумеш Кумават
Ответ 4
Вы бы просто использовали свой Skip(itemsInPage * pageNo).Take(itemsInPage)
для пейджинга.