2017-06-01 29 views
0

在此article中,它显示了我们如何在lambda表达式中组合多个列。但是它返回一个IEnumerable<IEnumerable<TSource>>,这不是我想要实现的结果。将GroupBy用于多列和返回列表<TSource>

我创建了一个包含几个属性的类。现在

internal class Class1 
{ 
    internal string prop1 { get; set; } 
    internal string prop2 { get; set; } 
    internal decimal? prop3 { get; set; } 
} 

,如果我创建了以下lambda表达式,它返回一个IQueryable<IEnumerable<Class1>> listClass1

var listClass1 = context.Table1 
    .Join(context.Table2, 
      t1 => t1.Id, 
      t2 => t2.Table1Id, 
      (t1, t2) => new { t1, t2 }) 
    .Where(/*some expressions here*/) 
    .GroupBy(data => new 
    { 
     data.t1.Column1, 
     data.t2.Column2, 
    }) 
    .Select(data => data.Select(x => new Class1 
    { 
     prop1 = x.t1.Column1, 
     prop2 = x.t2.Column2, 
     prop3 = x.t1.Column3 
    })); 

但我想有一个List<Class1> listClass1,因为我打算使用foreach遍历每个元素在列表中。这可能吗?

回答

0

然后你不应该使用GroupBy()GroupBy()的目标是将单个项目列表拆分为多个项目列表。
项目的分配基于相同的键值进行。在你的情况下,密钥由多个列组成,但原则保持不变。

SelectMany()GroupBy()相反。它从多个不同的列表中创建一个列表。

您的问题的直接答案是,您应该将Select()更改为SelectMany()。这正是你想要的。


但这不是你的情况的最佳解决方案。完成GroupBy().SelectMany()完全没有意义,因为这些操作取消了彼此!

var listClass1 = context.Table1 
    .Join(context.Table2, 
     t1 => t1.Id, 
     t2 => t2.Table1Id, 
     (t1, t2) => new { t1, t2 }) 
    .Where(/*some expressions here*/) 
    .Select(x => new Class1 
     { 
      prop1 = x.t1.Column1, 
      prop2 = x.t2.Column2, 
      prop3 = x.t1.Column3 
     }); 

编辑从下面的评论,我可以看到你正在使用一组被作为一种方式来获得不同的值(即完全等于没有双行)

这可以

var listClass1 = context.Table1 
    .Join(context.Table2, 
     t1 => t1.Id, 
     t2 => t2.Table1Id, 
     (t1, t2) => new { t1, t2 }) 
    .Where(/*some expressions here*/) 
    .Distinct() //filters out all the double entries 
    .Select(x => new Class1 
     { 
      prop1 = x.t1.Column1, 
      prop2 = x.t2.Column2, 
      prop3 = x.t1.Column3 
     }); 

I refer you to this SO question that addresses when to use DISTINCT or GROUP BY.
的PRINC:通过使用Distinct()方法来进行对于SQL和LINQ,iple是相同的,因为LINQ试图模拟SQL如何工作。

+0

那么如何将以下SQL语句转换为lambda表达式?这个查询中的结果是我试图实现的结果。 'SELECT t1.Column1,t2.Column2,t1.Column3 FROM dbo.Table1 T1 \t INNER JOIN dbo.Table2 T2 ON t1.Id = t2.Table1Id WHERE - 有些表达式 GROUP BY t1.Column1, t2.Column2,t1.Column3' –

+2

'SELECT t1.Column1,t2.Column2,t1.Column3 ... GROUP BY t1.Column1,t2.Column2,t1.Column3'在功能上等同于'SELECT DISTINCT t1.Column1, t2.Column2,t1.Column3 ...'如果你真的想要使用聚合函数,你应该只使用分组**,例如**计算每个城市有多少人会选择'Select CityName,Count(*)从城市名称的公民组。您不调用聚合函数,因此不需要使用group by。 – Flater

+0

您编辑的答案解决了我的问题!所以现在我清楚这两者之间的区别。我应该用DISTINCT代替。谢谢!我会将其标记为答案。 –