简体   繁体   中英

LINQ OrderBy Count of Records in a Joined Table

I'm having trouble translating the following tSQL to LINQ to SQL in C#. Any help would be much appreciated:

SELECT P.Name
FROM Product P
    INNER JOIN OrderItems OI ON P.productID = OI.productID
        INNER JOIN Orders O ON OI.orderID = O.orderId
WHERE P.Active = 1 AND O.Status > 2
ORDER BY count(OI.orderID) DESC

It's the ordering by the COUNT of a JOINED table that's throwing me for a loop.

Here's what I have so far (with no orderby):

from p in CRM.tProducts
    join oi in CRM.tOrderItems on p.prodID equals oi.prodID
    join o in CRM.tOrders on oi.orderID equals o.orderID
where o.status > 1 && p.active == true
select p;

Thanks for any help!

You need to execute a group by if you want the count

SELECT P.Name
FROM Product P
    INNER JOIN OrderItems OI ON P.productID = OI.productID
        INNER JOIN Orders O ON OI.orderID = O.orderId
WHERE P.Active = 1 AND O.Status > 2
GROUP BY P.Name
ORDER BY count(*) DESC

I'll assume you actually want the count for each group in the projection.

from p in CRM.tProducts
    join oi in CRM.tOrderItems on p.prodID equals oi.prodID
    join o in CRM.tOrders on oi.orderID equals o.orderID
where o.status > 1 && p.active == true
group p by p.Name into nameGroup
orderby nameGroup.Count()
select new { Name = nameGroup.Key, Count = nameGroup.Count() };

See comment to question.

How to do "order by" in linq ->

If you have

  var alist = ....  select new { prd = p, ord =  o };

you can do

  alist.sort( (a, b) => a.ord.CompareTo(b.ord) );

to sort it in place.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM