我从数据库中获取记录并将结果存储在数据集中。
我的数据集就像这样
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,有一些像那样。有没有办法选择所有列而不是指定列名?
答案 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)
如果我理解你的例子,你需要的是用以下算法描述的:
Sid
,Table
和userid
为此,您可以使用以下代码:
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
中的对象一样。您可以将行绑定到任何网格,而不会遇到有关缺少成员的错误。