2011-12-02 62 views
1

我在將以下tSQL轉換爲C#中的LINQ to SQL時遇到問題。任何幫助將不勝感激:LINQ OrderBy連接表中的記錄數

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 

這是一個JOTED表的COUNT排序,引發我一個循環。

這裏是我到目前爲止(無排序依據):

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; 

感謝您的幫助!

+2

SQL是有問題的 - 你如何計算一個沒有group by的元素? – Hogan

+0

你說得對。我沒有真正嘗試SQL。我真正想要做的是這樣的: '選擇 \t P.name, \t(SELECT COUNT(OI.OrderItem_ID)FROM ORDER_ITEMS OI WHERE OI.Product_ID = P.Product_ID)爲普及 FROM商品P ORDER BY流行desc' – Stephen

回答

3

您需要的,如果你想計數

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 

我會假設你真的想爲每個組在投影計數執行組。

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() }; 
+1

+1爲好的解決方案,但我認爲你的意思是'nameGroup'代替'myGroup',反之亦然。 – shuniar

+1

@shuniar - 是的,謝謝 –

+0

感謝您的幫助...我有一個後續問題。基本上,我想根據他們訂購多少次來創建「暢銷品」頁面來對我的產品進行分類。下面是一些SQL代碼,將做到這些: 選擇 \t P.name, \t(SELECT COUNT(OI.OrderItem_ID)FROM ORDER_ITEMS OI WHERE OI.Product_ID = P.Product_ID)爲普及 FROM商品P ORDER BY普及desc 你可以直接將它翻譯成LINQ嗎? – Stephen

0

查看對問題的評論。

如何 「按訂單」 做LINQ - >

如果你有

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

你可以做

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

到位它排序。

+0

擴展方法名稱是OrderBy()和OrderByDescending(),而不是sort()。 – BACON