2011-12-02 30 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