2017-10-21 102 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);