Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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# can';t从a";分组方式;_C#_Sql_Linq_Linq To Sql_Group By - Fatal编程技术网

C# can';t从a";分组方式;

C# can';t从a";分组方式;,c#,sql,linq,linq-to-sql,group-by,C#,Sql,Linq,Linq To Sql,Group By,尝试获取产品Id列表,其中包含每个Id的反馈量 只需要将提供给产品的反馈统计为属于特定类别(请参阅SQL脚本:categoryId==50)。产品可以属于多个类别 productId, cnt 14, 0 16, 0 15, 1 09, 2 10, 2 编辑: 我提出了下面的LINQtoSQL,以重新创建我通过下面的SQL脚本表达的逻辑。但结果却不一样。无法从SQL脚本中获取LINQ逻辑的不同之处 LINQ到Sql: v

尝试获取产品Id列表,其中包含每个Id的反馈量 只需要将提供给产品的反馈统计为属于特定类别(请参阅SQL脚本:categoryId==50)。产品可以属于多个类别

productId, cnt
14,        0
16,        0  
15,        1
09,        2
10,        2
编辑:

我提出了下面的LINQtoSQL,以重新创建我通过下面的SQL脚本表达的逻辑。但结果却不一样。无法从SQL脚本中获取LINQ逻辑的不同之处

LINQ到Sql:

var result = 
(
from pcl in db.productCategoryLookup
join p in db.products on pcl.productId equals p.productId
join f in db.feedbacks on p.productId equals f.feedbackId into bb
from g in bb.DefaultIfEmpty()
where (pcl.categoryId == 50)
group p by p.productId into grp
select new
{
    productId = grp.Key,
    cnt = grp.Count()
} into res1
orderby res1.cnt
select new
{
    producetId = res1.productId,
    cnt = res1.cnt
}
)
.Take(5)
.ToList();
SQL脚本:

 SELECT TOP 5
        p.productId,
        COUNT(f.feedbackId)
    FROM ProductCategoryLookup pcl
    INNER JOIN Product p
        ON p.productId = pcl.productId
    LEFT JOIN Feedbacks f
        ON f.productId = p.productId
    WHERE 
        pcl.categoryId = 50
    GROUP BY
        p.productId
    ORDER BY
        COUNT(f.feedbackId)
表:

**Products** table
productId   PK
productName  string

**ProductCategoryLookup** table. Connects products with Category.
One product can have multiple categories and the feedback goes 
for given product in given category.
productId   FK
categoryId  FK
. . .

**Feedbacks** table. Each product+category pair gets zero or more feedbacks.
feedbackId   PK
productId    FK
categoryId   FK
 . . .

**Category** table. 
categoryId   pk
name 

对于AD.Net的答案,我在productCategoryLookup的“from”之后添加了join,以及where子句。现在工作!谢谢。

尝试以下查询。这可能对你有帮助

(from p in context.Products
select new {Product = p, Count = p.Feedbacks.Any() ? p.Feedbacks.Count() : 0})
.OrderBy(p=>p.Count)
.Take(5)
.Select(p=>p.Product)
.ToList()
db.Products.Select(n => new { n.ProductID, count = n.Feedbacks.Count})
                .OrderBy(m=>m.count).Take(5).ToList();

似乎有一些'魔术'与计数,我没有得到现在的实际问题是什么?我已经编辑了你的标题。请参见“”,其中的共识是“不,他们不应该”。实际问题是试图获得反馈最少的前五名产品(不是最差的,但只是反馈数量)。反馈记录在Feddback表中。好的,但什么不起作用?OP还有一个.ToList()谢谢,这比我的好多了。。。但结果与要求相差甚远。至少这给了我一个新的尝试方向!顺便问一下,您是否故意将context.productCategoryLookup放在外面?不,如果您只想要反馈最少的产品,它应该这样做。顺便说一句,它应该是orderby,而不是orderbydescending,这是另一种方式。好的,然后你还可以获取categoryid,按它分组,然后执行orderby和take(5)