在DataTable.Select函数中使用distinct

时间:2014-11-27 10:03:23

标签: c# datatable

我有一个数据表,我想使用这个数据表填充两个额外的数据表,这是我表的一个简单形式

My data table columns are 
[name][family][id][propertyid][propertyEnergy]
John smith 1 12 Gas
John smith 1 13 Gas
John smith 1 14 null
John smith 1 15 Gas
Hannah smith 2 16 Gas
Hannah smith 2 17 Gas
Hannah smith 2 18 Gas

我想在数据表select distinct [name][family][id] from table中使用此查询 结果

John smith 1
Hannah smith 2

我再次在另一个数据表select [id][propertyid][propertyEnergy] from table中使用此查询结果

1 12 Gas
1 13 Gas
1 14 null
1 15 Gas
2 16 Gas
2 17 Gas
2 18 Gas

我搜索并发现我可以DataTable.Select,但我看到的示例显示我只能将{sen}添加到DataTable.Select并且我不知道如何执行Distinct之类的操作在里面, 你能帮帮我或给我一些提示怎么做? 非常感谢你

1 个答案:

答案 0 :(得分:1)

我改用Linq-To-DataTable

var distinctNames = table.AsEnumerable()
    .Select(row => new
    {
        Name = row.Field<string>("Name"),
        Family = row.Field<string>("Family"),
        ID = row.Field<int>("ID")
    })
    .Distinct();

var distinctProperties = table.AsEnumerable()
    .Select(row => new
    {
        ID = row.Field<int>("ID"),
        PropertyID = row.Field<int>("PropertyID"),
        PropertyEnergy = row.Field<int>("PropertyEnergy")
    })
    .Distinct();

如果您需要另外两个DataTables,则必须手动创建并填充它们,因为列与主表不同。您可以从上面的查询中填充它们。

这应该按原样运作:

string[] nameColumns = { "Name", "Family", "ID" };
DataTable tblNames = table.Clone();
var removeColumns = tblNames.Columns.Cast<DataColumn>()
    .Where(c => !nameColumns.Contains(c.ColumnName)).ToList();
removeColumns.ForEach(c => tblNames.Columns.Remove(c));
foreach (var x in distinctNames)
    tblNames.Rows.Add(x.Name, x.Family, x.ID);

string[] propertyColumns = { "ID", "PropertyID", "PropertyEnergy" };
DataTable tblProperties = table.Clone();
removeColumns = tblProperties.Columns.Cast<DataColumn>()
    .Where(c => !propertyColumns.Contains(c.ColumnName)).ToList();
removeColumns.ForEach(c => tblProperties.Columns.Remove(c));
foreach (var x in distinctProperties)
    tblProperties.Rows.Add(x.ID, x.PropertyID, x.PropertyEnergy);