从Group By LINQ查询中选择1列

时间:2015-03-19 12:15:57

标签: c# linq group-by

我认为我需要的是相对简单的,但每个例子我谷歌只使用First()返回结果,我已经在做了。这是我的表达:

var options = configData.AsEnumerable().GroupBy(row => row["myColumn"]).Select(grp => grp.First());

我需要的只是grp部分中的一列,并且能够在那里后缀.ToList()而没有错误。目前我只收到4列,但只需要一个特定的列,有点像(grp => grp["myColumn"]),没有导致错误153 Cannot apply indexing with [] to an expression of type 'System.Linq.IGrouping<object,System.Data.DataRow>'

此外,Key在分组部分不起作用,因为这些结果来自DataTable个对象。看到这里 - &gt; enter image description here

3 个答案:

答案 0 :(得分:2)

认为这就是你想要的:

configData.AsEnumerable()
    .GroupBy(r => r["myColumn"])
    .Select(g => new
    {
        myColumnValue = g.Key, 
        myColumnItems = g.Select(r => r["OtherColumn"]).ToList()
    });

你明白这是怎么回事?尝试一下,检查生成的IEnumerable。我不确定你对GroupBy如何运作有完美的理解,但是请以上面的例子来节省时间。

见这部分:

new
{
    myColumnValue = g.Key, 
    myColumnItems = g.Select(r => r["OtherColumn"]).ToList()
}

这将创建一个匿名类型,输出&#34; OtherColumn&#34;的值。列到按&#34; myColumn&#34;分组的列表中其中&#34; myColumn&#34;的价值在myColumnValue属性中。

我不确定这会回答你的问题,但看起来这就是你想要的。

变量g的类型为IGrouping<object, DataRow>,而不是DataRowIGrouping界面旨在提供按对象值分组的 DataRow 列表 - 它不生成平面列表,如果它然后生成它只是一个排序,而不是GroupBy。

答案 1 :(得分:1)

只需在调用First()后指定所需的字段,例如

.Select(grp => grp.FirstOrDefault()["MyFieldName"]);

这将从分组中获取第一条记录,并从该记录中选择指定的字段。

答案 2 :(得分:1)

如果您只想要按键,可以使用

var options = configData.AsEnumerable().Select(row=>row["myColumn"]).Distinct();