Home > Blockchain >  Entity Framework Linq Query to return list of IDs
Entity Framework Linq Query to return list of IDs

Time:01-06

How do I get a list of companyIDs who shipped all their orders in linq? Scenario: Each company got a bunch of customers and orders for customers. Here from the below tables, CompanyB and CompanyC has shipped all the orders to customers and I want to get those ID from a linq query.

3 tables involved Company, Customers and Orders

Company
CompanyID CompanyName
   1         CompanyA
   2         CompnayB
   3         CompnayC

Customers
CustomerID CustomerName   CompanyID
   1         CustomerA      1
   2         CustomerB      2
   3         CustomerC      2
   4         CustomerD      2
   5         CustomerE      1
   6         CustomerF      2
   7         CustomerG      3


Orders
OrderID  CustomerID  Shipped
  1         2           1
  2         3           1
  3         4           1
  4         6           1
  5         1           0
  6         7           1

Here is what I tried and I'm not getting the right output

var IDs = Company.Where(co => co.Customers.Any(cu => cu.Orders.Any(o => o.shipped))).ToList();

Any help is much appreciated..

CodePudding user response:

Try this:

    var IDs =  (from co in Company
             join cu in Customers on co.CompanyID equals cu.CompanyID
             join o in Orders on cu.CustomerID  equals o.CustomerID
             where o.Shipped
             select new { co.CompanyID }).ToList();

CodePudding user response:

I haven't tried running this, but what if I try All instead of Any? Probably, if you are working with a database on EF and not just a collection, you should have lazy loading enabled. And, since you only need the ID, I added Select

var IDs = Company
    .Where(co => co.Customers.All(cu => cu.Orders.All(o => o.Shipped)))
    .Select(co => co.CompanyID)
    .ToList();

CodePudding user response:

you can join two tables with linq like below :

var Ids = (from cu in Customers
          join o in Orders on cu.CustomerId equals o.CustomerId
          where o.Shipped
          select cu.CompanyId).Distinct().ToList();

and you can use fluentApi :

var ids = Orders.Where(o => o.Shipped).Join(Customers, o => o.CustomerId, c => c.CustomerId, (o, c) => new
{
    c.CompanyId
}).Distinct().ToList();

CodePudding user response:

You can rely on SelectMany as an alternative to double All calls:

var companyIds = Companies
    .Where(co => co.Customers.SelectMany(c => c.Orders).All(o => o.shipped))
    .Select(co => co.CompanyId)
    .ToList();

This feels slightly more semantic IMHO for your requirement.

  • Related