如何在linq to sql中做多个Group By?

时间:2009-08-29 01:35:22

标签: asp.net-mvc linq-to-sql

你怎么能在linq to sql中做多个“group by's”?

您能否以linq查询语法和linq方法语法向我展示。

由于

编辑。

我说的是多个参数,分别按“性别”和“年龄”进行分组。

此外,我忘了提及在我将它们分组之前我怎么说加起来。

如果我有这个例子我将如何做到这一点

表产品

产品编号 产品名称 ProductQty ProductPrice

现在想象一下,无论出于什么原因,我都有大量行,每行都有相同的ProductName,不同的ProductQty和ProductPrice。

我如何通过产品名称填充下边缘并将ProductQty和ProductPrice加在一起?

我知道在这个例子中,为什么一行一行地使用相同的产品名称,但在我的数据库中它有意义(它不是产品)可能没有任何意义。

1 个答案:

答案 0 :(得分:5)

要按多个属性进行分组,您需要创建一个新对象以进行分组:

var groupedResult = from person in db.People
                    group by new { person.Sex, person.Age } into personGroup
                    select new 
                    { 
                        personGroup.Key.Sex, 
                        personGroup.Key.Age, 
                        NumberInGroup = personGroup.Count() 
                    }

道歉,我没有看到你的最终编辑。我可能会误解,但如果你总结年龄,你就不能把它归为一类。您可以按性别分组,总计或平均年龄......但您不能在一个声明中同时按性别和总计年龄进行分组。有可能使用嵌套的LINQ查询来获得任何给定性别的总和或平均年龄......但是更复杂。

编辑:

要解决您的具体问题,它应该非常简单明了。您只按名称进行分组,因此其余部分是基本的(示例使用服务和具体的dto类型更新):

class ProductInventoryInfo
{
    public string Name { get; set; }
    public decimal Total { get; set; }
} 

class ProductService: IProductService
{

    public IList<ProductInventoryInfo> GetProductInventory()
    {
        // ...

        var groupedResult = from product in db.Products
                            group by product.ProductName into productGroup
                            select new ProductInventoryInfo
                            {
                                Name = productGroup.Key,
                                Total = productGroup.Sum(p => p.ProductCost * p.ProductQty)
                            }

        return groupedResult.ToList();
    }
}