如何将此SQL翻译成LINQ?(按受欢迎程度排序)

3

编辑:根据下面的一篇文章,我找出了如何编写它的方法。答案在本文末尾。

我有一个商店……其中一个下拉菜单允许您按受欢迎程度(最常购买的商品会首先显示)对产品进行排序。

我知道如何在SQL中编写此内容,但是我在LINQ中失败了。有人可以为我翻译一下吗?希望如果我看到足够多的这些示例,我就能更好地学会自己做……

我只想把所有的项目都带回来,但是按受欢迎程度排序。您可以通过查看“OrderDetails”表中itemId出现的次数来确定哪些商品最受欢迎。

select i.*
from items i
left outer join (
    select od.itemid, ct = COUNT(1)
    from orderdetails od
        join orders o on od.orderid = o.orderid
    where o.ordersubmitteddate is not null
    group by od.itemid
    ) pop on pop.itemid = i.itemid
order by pop.ct desc, i.name

------ 在下面回答 -------

这里是答案,我首先编写一个查询以确定要展示哪些“项”...然后我编写第二个查询来对其进行排序....

var items = db.Items.Where("STUFF");

items = from i in items
        join pop in (
            from od in db.OrderDetails
            where od.Order.OrderSubmittedDate != null
            group od by od.ItemId into g
            select new { ItemId = g.Key, Ct = g.Count() }
        ) on i.ItemId equals pop.ItemId into pop_join
        from x in pop_join.DefaultIfEmpty()
        orderby x.Ct descending, i.Name
        select i;

我建议你安装这个工具,以备将来之需 http://www.sqltolinq.com/ - Massimiliano Peluso
2个回答

1

嗯,你可以试试

var pop =   from od in context.OrderDetail
            join o in context.Order on od.OrderId equals o.OrderId
            where o.OrderSubmittedDate != null
            group by od.ItemId into g
            select new { ItemId = g.Key, Count = g.Count() };

var query = from p in pop
            join i in items on p.ItemId equals i.ItemId into j
            from x in j.DefaultIfEmpty()
            order by x.Count descending, i.Name;

这肯定会让你朝着正确的方向前进,但我不能保证它甚至能编译。思路是你可以在LINQ to SQL中嵌套查询。

谢谢...基于这个...我把我的答案放在上面了。 - Ralph N

0
from i in Items
orderby i.ItemOrderDetails.Count(o=>o.Order.OrderSubmittedDate!=null) descending
select i

如果您的商品和订单详情之间没有关联,那么可以这样做:
from i in Items
orderby (OrderDetails.Count(d=>d.ItemId==i.Id && d.Order.OrderSubmittedDate!=null)) descending
select i

如果您更喜欢尽可能使用查询语法,也可以这样表达:

from i in Items
let OrdersSubmitted= 
( from d in OrderDetails
  where d.ItemId == i.Id 
  where d.Order.OrderSubmittedDate != null
  select d)
orderby OrdersSubmitted.Count() descending 
select i

let 语句非常方便,可用于生成更易读的 linq 语句。


很不幸,我的项目中没有到订单详情的外键链接...这会导致“循环”引用吗(之前在SQL中看到过这样的错误,必须删除其中一个外键)? - Ralph N
一个关系电路只有在所有一对多连接指向同一方向时才是完整的(你只能从多的一侧遍历连接到一的一侧)。 - sga101
嗯...这些编辑看起来很有前途。我会重新访问并稍后回到这篇文章... - Ralph N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接