2017-10-21 161 views
0

我有一个包含此格式记录的表(Items)。我如何在实体框架中编写此查询

Name  | ProductId | Owner 
Product1 | 1   | xx 
Product2 | 2   | yy 
Product1 | 1   | xx 
Product3 | 3   | xx 
Product3 | 3   | xx 
Product3 | 3   | xx 
Product4 | 4   | xx 
Product2 | 2   | xx 
Product5 | 5   | xx 

我想写实体框架查询将返回前3名的产品,它们的名称和数量。结果应该看起来像这样。

Result 
Name: [Product3, Product2, Product1], 
Count:[3, 2, 2] 

我已经检查了其他答案,所以我仍然没有找到接近我想要的东西。注名称和计数分别返回前3名的列表。

+0

如何使用linq GroupBy?你想用linq吗? –

+0

@AryanFirouzyan,是的,如果返回预期的输出 –

+0

@InBetween回答似乎好 –

回答

3

虽然我建议你从数据库中获得前3名的产品与计数一起你可以试试这个代码

var query = context 
      .products 
      .GroupBy(p => p.Name) 
      .OrderByDescending(g => g.Count()) 
      .Take(3); 

products.Select(p => new 
{ 
    Name = query.Select(g => g.Key).ToList(), 
    Count = query.Select(g => g.Count()).ToList(), 
}) 
.FirstOrDefault(); 

,然后把它放在不同的目录,像这样:

var products = context.products 
      .GroupBy(p => p.Name) 
      .OrderByDescending(g => g.Count()) 
      .Take(3) 
      .Select(g => new 
      { 
       Name = g.Key, 
       Count = g.Count() 
      }) 
      .ToList(); 
List<string> names = products.Select(p => p.Name).ToList(); 
List<int> counts = products.Select(p => p.Count).ToList(); 
+0

你应该按降序排列,否则你是最低的3个产品。 – InBetween

+0

@In你说得对,谢谢。我编辑了答案 – Kahbazi

+0

谢谢@阿文,正是我所期待的。 –

2

下面应该工作:

products.GroupBy(p => p.ProductId) 
     .OrderByDescending(g => g.Count()) 
     .Take(3);