从一个组中选择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对象。看到这里 - >enter image description here

+0

呢'configData.AsEnumerable()的GroupBy(行=>行[ “myColumn”]),选择(GRP => grp.Key) .ToList();'不适合你? – stefankmitph 2015-03-19 12:34:31

+0

分组后,您有多个组,每个组有一个键和组项。您的单列是组密钥吗?如果不是,由于每个组中有多个项目,您将选择组中哪个项目的列? – 2015-03-19 12:55:27

只需指定您想要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分组的列表。

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

变量gIGrouping<object, DataRow>的类型,它不是DataRowIGrouping接口旨在提供一个列表DataRow的分组对象值 - 它不会产生一个平面列表,如果它确实那么它将只是一个Sort,而不是GroupBy。

+0

这可能是我需要的,但是如何处理列名中的'Null's?他们造成错误。 – Volearix 2015-03-19 12:33:37

+0

@Volearix如果你的值中有一个'null',你可以使用'.GroupBy(r => r [“myColumn”] ??“SomeNullString”)'。如果你有'DBNull',你可以做类似的事情。你可以在lambda表达式中以任何方式操作'r [“myColumn”],类似于'if'语句。我会编辑答案,如果这为你工作。 – bokibeg 2015-03-19 12:37:02

如果你只想要键,你可以使用

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