Подтвердить что ты не робот

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

Слава Хумешу и Правину за помощь в этом. Спасибо остальным за помощь.

4b9b3361

Ответ 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) для пейджинга.