C# 如何将此SQL转换为LINQ?(按受欢迎程度排序)
编辑:根据下面的一篇文章,我想出了如何写它。答案在这篇文章的末尾 我有一家商店。。。其中一个下拉列表允许您根据受欢迎程度对产品进行排序(购买最多的项目,首先显示) 我知道如何用SQL写这篇文章,但在LINQ中我失败得很惨。有人能帮我翻译一下吗?希望如果我看到足够多的例子,我自己会做得更好 我只是想把所有的东西都带回来,但要按受欢迎程度排序。通过查看itemId在“OrderDetails”表中出现的次数,可以判断哪些是最流行的 ------回答如下------- 答案是这样的,我先写一个查询来确定我想显示哪些“项目”。。。然后我写了第二个查询来排序C# 如何将此SQL转换为LINQ?(按受欢迎程度排序),c#,sql,linq,entity-framework,C#,Sql,Linq,Entity Framework,编辑:根据下面的一篇文章,我想出了如何写它。答案在这篇文章的末尾 我有一家商店。。。其中一个下拉列表允许您根据受欢迎程度对产品进行排序(购买最多的项目,首先显示) 我知道如何用SQL写这篇文章,但在LINQ中我失败得很惨。有人能帮我翻译一下吗?希望如果我看到足够多的例子,我自己会做得更好 我只是想把所有的东西都带回来,但要按受欢迎程度排序。通过查看itemId在“OrderDetails”表中出现的次数,可以判断哪些是最流行的 ------回答如下------- 答案是这样的,我先写一个查询来确
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;
嗯,你可以试试
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到SQL中嵌套查询
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
如果希望使用尽可能多的查询语法,也可以这样表示:
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中看到了一个错误,必须删除一个外键)关系循环是不完整的,除非所有一对多连接指向同一方向(您只能从多侧遍历连接到一侧)。。编辑工作似乎很有希望。我将再次访问并稍后返回此帖子…谢谢。。。基于此。。。我把答案放在上面。