Выполните GroupJoin и Join в одном запросе в Entity Framework Core - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь выполнить объединение внутри группового соединения с помощью Linq.Вот сценарий - для каждого элемента строки в заказе я хочу получить некоторые атрибуты из варианта для этой позиции (например, варианты вариантов и imageid, которые хранятся в базах данных вариантов и продуктов).я хочу присоединиться к lineitem, вариантам и базам данных продуктов, чтобы получить эту дополнительную информацию для lineitem, а затем объединить этот lineitem с таблицей заказов.Я сделал это и получил желаемый результат, используя два запроса, но я не уверен, сколько запросов к базе данных выполняется.И в первом случае (т. Е. В соединении предел не может быть указан, поэтому я просто хочу убедиться, что первый запрос в приведенном ниже коде оценивается только при вызове .ToListAsync ()).Это правильный способ сделать это?Любая помощь будет принята с благодарностью!

  public async Task<dynamic> GetOrdersAsync(User user, int pageNumber = 1)
        {
            var perPage = 10;
            var lineItemAndVariant = from l in _context.LineItems
                                     join v in _context.Variants
                                     on l.EcomPlatformVariantId equals v.EcomPlatformVariantId
                                     join p in _context.Products
                                     on v.ProductId equals p.Id
                                     where p.UserId == user.Id
                                     select new
                                     {
                                         l.Id,
                                         l.OrderId,
                                         l.Price,
                                         l.Quantity,
                                         l.EcomPlatformLineItemId,
                                         l.EcomPlatformVariantId,
                                         l.Title,
                                         ImageId = v.ImageId ?? p.ThumbnailId, // for adding image 
                                         p.MyVendor,
                                         p.MyVendorId,
                                         v.Option1,
                                         v.Option2,
                                         v.Option3,
                                         p.VariantOption1Label,
                                         p.VariantOption2Label,
                                         p.VariantOption3Label
                                     };


            var orders = await _context.Orders
                .Where(o => o.UserId == user.Id)
                .OrderByDescending(o => o.Id)
                .Skip(perPage * (pageNumber - 1)).Take(perPage)
                .GroupJoin(lineItemAndVariant, o => o.Id, l => l.OrderId,
                (o, lineItems) => new
                {
                    o.Id,
                    o.EcomPlatformOrderId,
                    o.CustomerEmail,
                    o.FirstName,
                    o.LastName,
                    o.Address1,
                    o.Address2,
                    o.City,
                    o.Company,
                    o.Country,
                    o.Currency,
                    o.OrderNumber,
                    o.Phone,
                    o.Province,
                    o.TotalPrice,
                    o.UserId,
                    o.Zip,
                    o.CreatedAt,
                    LineItems = lineItems
                })
                .AsNoTracking().ToListAsync();


            return orders;

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...