Выбор полей из другой таблицы - PullRequest
0 голосов
/ 30 мая 2019

у меня 3 таблицы. Заказ, Линии Заказа и Магазины. В таблице Order есть StoreId, который является внешним ключом из таблицы Stores, а в таблице Orderlines есть внешний идентификатор из таблицы Order. Мне нужно только получить поля Order.OrderId, Order.WarehouseOrderId, Store.StoreName и количество Orderlines на Order. Так что в настоящее время это моя реализация:

public List<Order> GetOrdersDashboardWithoutStatus1(SearchDashboardCriteria cri)
{
    using (var ctx = CreateDbContext())
    {
        var orders = (from items in ctx.Orders select items);
        if (cri.MerchantId != 0)
        {
            orders = orders.Where(x => x.Store.MerchantId == cri.MerchantId);
        }

        return orders.Where(x => (DbFunctions.TruncateTime(x.DateImported) >= DbFunctions.TruncateTime(cri.StartDate))
                && (DbFunctions.TruncateTime(x.DateImported) <= DbFunctions.TruncateTime(cri.EndDate)))
                 .Include(x => x.Store).Include(x => x.OrderLines).ToList();
    }
}

В настоящее время реализация работает, но производительность очень низкая, и иногда возникает ошибка тайм-аута, поскольку записи могут иметь более 30 тыс. Заказов.

1 Ответ

0 голосов
/ 30 мая 2019

Вы можете попробовать что-то вроде этого

using (var ctx = CreateDbContext())
{
            var orders = (from x in ctx.Orders 
                          where x.Store.MerchantId == cri.MerchantId
                          && add your other where condition
                          select NewDataModel
                          {
                            orderId = x.OrderId,
                            wareHouse = x.WarehouseOrderId,
                            storeName = x.Store.StoreName
                          }).ToArray();

}

Анонимная проекция или проекция на вашу пользовательскую модель извлекает только те столбцы, которые включены в проекцию.

Вместо Select * from Orders ... это будетSelect OrderId,WareHouseOrderId from Orders

Вы также можете попробовать выполнить пейджинг (Take,skip), если ваш сценарий использования поддерживает это. Аналогичный ответ для анонимной проекции

...