使用linq从datatable获取不同的记录到datatable并显示数据表的所有列

时间:2016-03-02 11:55:22

标签: asp.net asp.net-mvc linq

我从数据库中获取记录并将结果存储在数据集中。

我的数据集就像这样

Sid Table userid par1 par2 par3
274 tbl1  43     0    0    0
232 tbl1  43     1    2    0
232 tbl1  43     1    2    1
232 tbl2  43     1    2    0
232 tbl2  43     1    2    1

我想显示所有6列但不同的记录.Distinct应该在Sid,Table和userid上。我想要这样的输出

Sid Table userid par1 par2 par3
 274 tbl1  43     0    0    0
 232 tbl1  43     1    2    0
 232 tbl2  43     1    2    0

使用以下查询。我是linq的新手。

Datatable.Rows.Cast<DataRow>()
.GroupBy(r => new { Sid = r.Field<int>("Sid"), userid = r.Field<int>("userid"), Table = r.Field<string>("Table") })
.Select(e => e.FirstOrDefault())
.Select(grp => new
{
    Sid = grp.Field<int>("Sid"),
    userid = grp.Field<int>("userid"),
    Table = grp.Field<string>("Table"),
    par1 = grp.Field<int>("par1"),
    par2 = grp.Field<int>("par2"),
    par3 = grp.Field<int>("par3")
});

我的列在本质上是动态的。一些用户有par2,有一些像那样。有没有办法选择所有列而不是指定列名?

2 个答案:

答案 0 :(得分:0)

从逻辑上讲,这种方法可能不正确。例如,在您的记录集中,第二行和第三行可以根据Sid,表和用户ID明确过滤到一行。但是,如果要访问不同查询的所有字段,结果将是任何一行,这可能导致par3根据返回的行具有不同的值。

Sid Table userid par1 par2 par3
232 tbl1  43     1    2    0
232 tbl1  43     1    2    1

如果您决定获取每个组的第一行的所有字段,请使用以下代码

var distinct2 = (from t in InYourDatabaseRows
group t by new { t.Sid, t.Table, t.userid }
into grp
select new { 
Sid = grp.Key.Sid,
Table = grp.Key.Table,
userid =grp.Key.userid,
par1 = grp.First().par1,
par2 = grp.First().par2,
par3 = grp.First().par3
}).ToList();    

答案 1 :(得分:0)

如果我理解你的例子,你需要的是用以下算法描述的:

  • SidTableuserid
  • 对行进行分组
  • 从组中返回第一行

为此,您可以使用以下代码:

var distinct = Datatable.Rows.Cast<DataRow>()
    .GroupBy(r => new
    {
        Sid = r.Field<int>("Sid"), 
        userid = r.Field<int>("userid"), 
        Table = r.Field<string>("Table")
    })
    .Select(g => g.First())

上面的代码将返回DataRow个对象的集合,其原始数据和结构与Datatable中的对象一样。您可以将行绑定到任何网格,而不会遇到有关缺少成员的错误。