我如何在实体框架中编写此查询

时间:2017-10-21 15:07:10

标签: c# sql-server database entity-framework linq-to-sql

我有一个表(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个产品,它们的名称和Count。结果应如下所示。

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

我已经在SO上检查了其他答案,但仍然找不到我想要的东西。注意Name和Count分别返回前3个列表。

2 个答案:

答案 0 :(得分: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();

虽然我建议您从数据库中获得前3个产品的数量,然后将其放在不同的列表中,如下所示:

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();

答案 1 :(得分:2)

以下内容应该有效:

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