从一个组中选择1列按LINQ查询
我认为我需要的是相对简单的,但是我的每个示例都只是使用First()
返回结果,我已经在做这些。这里是我的表达:从一个组中选择1列按LINQ查询
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
对象。看到这里 - >
只需指定您想要First()后调用的字段例如
.Select(grp => grp.FirstOrDefault()["MyFieldName"]);
这将从分组中获取第一条记录,并从该记录中选择指定的字段。
我认为这是你想要什么:
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()
}
这产生一个匿名类型,其输出“OtherColumn”列的值到由“myColumn”,其中“myColumn”的值在属性myColumnValue分组的列表。
我不确定这会回答你的问题,但看起来这是你想要的。
变量g
是IGrouping<object, DataRow>
的类型,它不是DataRow
。 IGrouping
接口旨在提供一个列表DataRow的分组对象值 - 它不会产生一个平面列表,如果它确实那么它将只是一个Sort,而不是GroupBy。
如果你只想要键,你可以使用
var options = configData.AsEnumerable().Select(row=>row["myColumn"]).Distinct();
呢'configData.AsEnumerable()的GroupBy(行=>行[ “myColumn”]),选择(GRP => grp.Key) .ToList();'不适合你? – stefankmitph 2015-03-19 12:34:31
分组后,您有多个组,每个组有一个键和组项。您的单列是组密钥吗?如果不是,由于每个组中有多个项目,您将选择组中哪个项目的列? – 2015-03-19 12:55:27