【问题标题】:How to do multiple Group By's in linq to sql?如何在 linq to sql 中进行多个 Group By?
【发布时间】:2009-08-29 01:35:22
【问题描述】:

如何在 linq to sql 中进行多个“分组”?

你能告诉我 linq 查询语法和 linq 方法语法吗?

谢谢

编辑。

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

另外我忘了提到在分组之前我会怎么说所有年龄。

如果我有这个例子,我会怎么做

餐桌产品

产品编号 产品名称 产品数量 产品价格

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

如何按产品名称对它们进行分组并将 ProductQty 和 ProductPrice 加在一起?

我知道在这个例子中,为什么会有一行又一行具有相同产品名称但在我的数据库中它是有道理的(它不是产品)。

【问题讨论】:

  • 您的意思是按多个参数分组?还是多级分组(组内组)?

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


【解决方案1】:

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

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

【讨论】:

  • 我可以在 2 个语句中完成,只要最终结果是我有一个总计的字段。
  • 您是在寻找每个性别的年龄总和,还是平均年龄?
  • 好吧,我实际上正在寻找两者的总和(性别和年龄示例,但在我的真实数据库中,我添加了 2 个表)。
  • 我放了一个我想做的排序的例子。
  • 你的说法是把产品成本和数量加在一起?还是他们最终会成为 2 个不同的领域?
猜你喜欢
  • 2010-12-31
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 2016-05-26
  • 2011-04-18
  • 2012-12-08
相关资源
最近更新 更多