0

I have a LINQ query that is returning the results and format I desire, but it seems a bit slow. Wondering if there is a way to improve its performance? The Items and Skus records are 1:1. For each Item there 5 ItemWhse and 5 SkuWhse records for each Skus record.

var orderItems = from item in db.Items
            join sku in db.Skus
                on item.Sku equals sku.Sku
            where item.OrderNumber == 12345678
            select new
            {
                Item = item,
                ItemWhse = from itemWhse in db.ItemWarehouse
                          where itemWhse.OrderNumber == item.OrderNumber
                            && itemWhse.LineNumber == item.LineNumber
                          select itemWhse,
                Sku = sku,
                SkuWhse = from skuWhse in db.SkuWarehouse
                            where skuWhse.Sku == sku.Sku
                            select skuWhse
            };
PixelPaul
  • 2,609
  • 4
  • 39
  • 70
  • Are these objects in memory or coming from the database? The devil is often in the details with optimizations. A lot of times, it is faster to grab the data from the tables separately out of the database, then join them in memory. Also, depending on your ORM, you could run something like EF Profiler to see the actual SQL being generated so you can start optimizing that. – Dan Csharpster Aug 03 '20 at 20:41
  • Coming from the database – PixelPaul Aug 03 '20 at 20:56
  • Is this ef? Or ef core? Please tag correctly – Julian Aug 03 '20 at 21:07
  • There can be numerous causes for bad performance. Start by checking the query plan. – Gert Arnold Aug 04 '20 at 07:01
  • make sure you have the **right indexs NB** – Seabizkit Aug 04 '20 at 08:51

1 Answers1

1

It might be slow because you are using subqueries. Try this out:

var orderItems = from item in db.Items
                             join sku in db.Skus
                                 on item.Sku equals sku.Sku
                             join itemWhse in db.ItemWarehouse
                                 on new { item.OrderNumber, item.LineNumber } equals new { itemWhse.OrderNumber, itemWhse.LineNumber }
                             join skuWhse in db.SkuWarehouse
                                 on item.Sku equals skuWhse.Sku
                             where item.OrderNumber == 12345678
                             select new
                             {
                                 Item = item,
                                 ItemWhse = itemWhse,
                                 Sku = sku,
                                 SkuWhse = skuWhse
                             };
lobstar
  • 310
  • 4
  • 8