Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将此SQL转换为LINQ?(按受欢迎程度排序)_C#_Sql_Linq_Entity Framework - Fatal编程技术网

C# 如何将此SQL转换为LINQ?(按受欢迎程度排序)

C# 如何将此SQL转换为LINQ?(按受欢迎程度排序),c#,sql,linq,entity-framework,C#,Sql,Linq,Entity Framework,编辑:根据下面的一篇文章,我想出了如何写它。答案在这篇文章的末尾 我有一家商店。。。其中一个下拉列表允许您根据受欢迎程度对产品进行排序(购买最多的项目,首先显示) 我知道如何用SQL写这篇文章,但在LINQ中我失败得很惨。有人能帮我翻译一下吗?希望如果我看到足够多的例子,我自己会做得更好 我只是想把所有的东西都带回来,但要按受欢迎程度排序。通过查看itemId在“OrderDetails”表中出现的次数,可以判断哪些是最流行的 ------回答如下------- 答案是这样的,我先写一个查询来确

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

我有一家商店。。。其中一个下拉列表允许您根据受欢迎程度对产品进行排序(购买最多的项目,首先显示)

我知道如何用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中看到了一个错误,必须删除一个外键)关系循环是不完整的,除非所有一对多连接指向同一方向(您只能从多侧遍历连接到一侧)。。编辑工作似乎很有希望。我将再次访问并稍后返回此帖子…谢谢。。。基于此。。。我把答案放在上面。