【问题标题】:Fetch distinct record from datatable using linq to datatable and shows all columns of datatable使用 linq to datatable 从数据表中获取不同的记录并显示数据表的所有列
【发布时间】:2016-03-02 11:55:22
【问题描述】:

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

我的数据集是这样的

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 列但不同的记录。不同应该在 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,一些 1 类似。有没有办法选择所有列而不是指定列名?

【问题讨论】:

  • 您希望结果是数据行还是匿名类型?
  • 我想将结果绑定到gridview

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


【解决方案1】:

从逻辑上讲,这种方法可能不正确。例如,在您的记录集中,可以根据 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();    

【讨论】:

    【解决方案2】:

    如果我正确理解了您的示例,您需要使用以下算法描述:

    • 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 中的一样。您可以将行绑定到任何网格,而不会遇到有关缺少成员的错误。

    【讨论】:

    • No RePierre,它不工作。我收到错误,'System.Data.DataRow' 不包含名为 'Sid' 的属性。当我尝试绑定 gridview 时。 >
    • @JuiTest,这很奇怪——它为什么要寻找房产?它应该查找名为 Sid 的列而不是属性。
    • ,我使用了你的查询并转换为数据表。所以我可以将它绑定到gridview
    • var distinct = Datatable.Rows.Cast() .GroupBy(r => new { Sid = r.Field("Sid"), userid = r.Field("userid"), Table = r.Field("Table") }) .Select(g => g.First()).CopyToDataTable()
    • @JuiTest,当您将光标悬停在其上时,thr CopyToDataTable() 方法的作用以及结果集合的类型(distinct)是什么?
    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多