Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将GroupBy用于多列并返回列表<;t来源>;_C# - Fatal编程技术网

C# 将GroupBy用于多列并返回列表<;t来源>;

C# 将GroupBy用于多列并返回列表<;t来源>;,c#,C#,在本文中,它展示了如何将lambda表达式中的多个列分组。但是,它返回一个IEnumerable,这不是我想要实现的结果 我创建了一个包含一些属性的类 internal class Class1 { internal string prop1 { get; set; } internal string prop2 { get; set; } internal decimal? prop3 { get; set; } } 现在,如果我创建以下lambda表达式,它将返回一

在本文中,它展示了如何将lambda表达式中的多个列分组。但是,它返回一个
IEnumerable
,这不是我想要实现的结果

我创建了一个包含一些属性的类

internal class Class1
{
    internal string prop1 { get; set; }
    internal string prop2 { get; set; }
    internal decimal? prop3 { get; set; }
}
现在,如果我创建以下lambda表达式,它将返回一个
IQueryable 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
    }));

但是我想要的是一个
列表class1
,因为我计划使用
foreach
迭代列表中的每个元素。这可能吗

那么您不应该使用
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
        });

编辑从您下面的评论中,我可以看出您正在使用分组方式来获取不同的值(没有完全相等的两行)

这可以通过使用
Distinct()
方法完成:

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


SQL和LINQ的原理是相同的,因为LINQ试图模拟SQL的工作方式。

那么我如何将下面的SQL语句转换为lambda表达式呢?这个查询中的结果就是我试图实现的结果<代码>从dbo.Table1 t1中选择t1.Column1,t2.Column2,t1.Column3 t1上的内部联接dbo.Table2 t2.Id=t2.Table1Id其中--一些表达式按t1.Column1,t2.Column2,t1.Column3分组
代码>选择t1.Column1,t2.Column2,t1.Column3。。。GROUP BY t1.Column1、t2.Column2、t1.Column3
在功能上等同于
选择不同的t1.Column1、t2.Column2、t1.Column3…
只有在实际需要使用聚合函数时才应使用分组,例如,计算每个城市居住的人数
选择城市名称,计数(*)来自CityName的公民组
。您没有调用聚合函数,因此不需要使用group by。您编辑的答案解决了我的问题!因此,我现在很清楚这两者之间的区别。我应该用DISTINCT来代替。非常感谢。我将把这标记为一个答案。