我认为我需要的是相对简单的,但每个例子我谷歌只使用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;
答案 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>
,而不是DataRow
。 IGrouping
界面旨在提供按对象值分组的 DataRow 列表 - 它不生成平面列表,如果它然后生成它只是一个排序,而不是GroupBy。
答案 1 :(得分:1)
只需在调用First()后指定所需的字段,例如
.Select(grp => grp.FirstOrDefault()["MyFieldName"]);
这将从分组中获取第一条记录,并从该记录中选择指定的字段。
答案 2 :(得分:1)
如果您只想要按键,可以使用
var options = configData.AsEnumerable().Select(row=>row["myColumn"]).Distinct();