0

Coming from SQL background I am used to joining 5-8 tables in single query. I can not imagine doing the same with Linq lambda expression syntax. Here I am joining 4-5 tables/collections.

EG:

var viewmodel = logs.Join(CargoElements.lstContainerLoadStatus.ToList(), l => l.LoadStatus, ls => ls.Value, (x, ls) =>
                   new
                   {
                       log = x,
                       LoadStatusDesc = ls.Text
                   })
                   .Join(db.CargoContainerSize, log => log.log.CargoContainerSizeID, ccsize => ccsize.Id, (log, ccsize) => new
                   {
                       log = log,
                       CargoContainerSizeIDDesc = ccsize.Size
                   }).Join(db.CargoContainerType, log => log.log.log.CargoContainerTypeID, cct => cct.Id, (log, cct) => new
                   {
                       log = log,
                       CargoContainerTypeIDDesc = cct.Name
                   }).GroupJoin(db.CargoFrom, log => log.log.log.log.CargoFromID, cf => cf.ID, (log, cf) => new
                   {
                       log = log,
                       cf = cf
                   }).SelectMany(temp => temp.cf.DefaultIfEmpty(), (temp, cf) => new
                   {
                       log = temp,
                       CargoFromIDDesc = cf.Description
                   }
                   )
                   .Select(x => new ContainerInLogsVM
                   {

                       ContainerInLogID = x.log.log.log.log.log.ContainerInLogID,
                       ContainerInID = x.log.log.log.log.log.ContainerInID,
                       CargoID = x.log.log.log.log.log.CargoID,
                       LoadStatus = x.log.log.log.log.log.LoadStatus,
                       LoadStatusDesc = x.log.log.log.log.LoadStatusDesc,
                       Shipper = x.log.log.log.log.log.Shipper,
                       CnFAgentName = x.log.log.log.log.log.CnFAgentName,
                       ShippingBill = x.log.log.log.log.log.ShippingBill,
                       ContainerNo = x.log.log.log.log.log.ContainerNo,
                       CargoContainerSizeID = x.log.log.log.log.log.CargoContainerSizeID,
                       CargoContainerSizeIDDesc = x.log.log.log.CargoContainerSizeIDDesc,
                       CargoContainerTypeID = x.log.log.log.log.log.CargoContainerTypeID,
                       CargoContainerTypeIDDesc = x.log.log.CargoContainerTypeIDDesc,
                       OtherType = x.log.log.log.log.log.OtherType,
                       VesselNo = x.log.log.log.log.log.VesselNo,
                       ShipperBillNo = x.log.log.log.log.log.ShipperBillNo,
                       SealOTLNo = x.log.log.log.log.log.SealOTLNo,
                       VoyageNo = x.log.log.log.log.log.VoyageNo,
                       BLNumber = x.log.log.log.log.log.BLNumber,
                       Purpose = x.log.log.log.log.log.Purpose,
                       CargoFromID = x.log.log.log.log.log.CargoFromID,
                       CargoFromIDDesc = x.CargoFromIDDesc,
                       OtherFrom = x.log.log.log.log.log.OtherFrom,
                       Status = x.log.log.log.log.log.Status,
                       Remark = x.log.log.log.log.log.Remark,
                       StatusChangedOn = x.log.log.log.log.log.StatusChangedOn,
                       StatusChangedBy = x.log.log.log.log.log.StatusChangedBy,
                       StatusChangedByDesc = "",
                       SysRemark = x.log.log.log.log.log.SysRemark
                   }

                   ).ToList();

This is ridiculous! Or am I doing it wrong? There has to be a better way in LINQ. I am looking for answers preferably in lambda expressions.

SamuraiJack
  • 5,131
  • 15
  • 89
  • 195
  • This might help. https://stackoverflow.com/questions/9720225/how-to-perform-join-between-multiple-tables-in-linq-lambda – bolkay May 17 '19 at 10:15
  • I think that you should replace the join to `CargoElements.lstContainerLoadStatus.ToList()` by a `Contains` statement, otherwise the statement can't be translated into SQL or it will produce very inefficient SQL. And yes, use navigation properties! If you show the class model and tell which ORM you're using (+ version) then we may be able to help you a bit further. – Gert Arnold May 17 '19 at 10:24

0 Answers0