LINQ Group By如何投射到非匿名类型?

4
我有以下LINQ示例:
var colorDistribution = 
    from product in ctx.Products
    group product by product.Color
    into productColors

    select
       new 
    {
       Color = productColors.Key,
       Count = productColors.Count()
    };

所有这些都是有意义的。

我想要实现的是将分组依据强类型化,而不是匿名类型。

比如说,我有一个ProductColour类,我想要将其分组为一个 List<ProductColour>

这种做法可行吗?

谢谢!

2个回答

4

编辑:好的,我完全误读了你的帖子。从看起来的样子来看,你不想按不同类型进行分组——你想将每个组的元素投射到不同的类型中。这是我会做的:

var colorDistributionSql = 
    from product in ctx.Products
    group product by product.Color
    into productColors

    select
       new 
    {
       Color = productColors.Key,
       Count = productColors.Count()
    };

var colorDistributionList = colorDistributionSql
      .AsEnumerable()
      .Select(x => new ProductColour(x.Color, x.Count))
      .ToList();

好的,让我们试一试...谢谢。 - user338195
@vikp:请查看编辑-我没有注意到这是SQL。现在我已经完全重新编写了答案,因为你使用“group by”一词让我感到困惑。我看到你想要将结果投影转换为自定义类型,而不是分组投影。 - Jon Skeet
嗨,感谢您的编辑和代码片段。为了做到这一点,我不必覆盖getHashCode()和equals()方法,对吧? - user338195
@vikp,不会的,因为GroupBy是由数据库执行的,它实际上不会执行任何.NET代码。 - Thomas Levesque
@vikp:嗯...我可能记错了可用的重载。我会修复的。但是,是的,那是一般的方法。 - Jon Skeet
显示剩余4条评论

3
LinqToSql允许将组直接投影到类型中(毕竟,该组只是一个IGrouping<T,U>类型)。但是,LinqToSql无法将构造函数转换为SQL。
IQueryable<ProductColour> colorDistributionSql =  
    from product in ctx.Products 
    group product by product.Color 
    into productColors 
    select new ProductColour()
    { 
       Color = productColors.Key, 
       Count = productColors.Count() 
    };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接