2016-03-02 58 views
0

我正在从数据库获取记录并将结果存储到数据集中。从数据表使用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列,但不同的record.Distinct应该是希德的数据集,表和userid.I希望这样

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") 
}); 

我的专栏是动态的,在nature.some用户已经par2的,一些喜欢that.Is有什么办法可以选择所有列,而不是指定的列名?

+0

你想要结果作为数据行或匿名类型? – RePierre

+0

我想将结果绑定到gridview –

回答

0

逻辑上这种方法可能不正确。例如,在你的记录集中,第二行和第三行可以根据Sid,表格和用户标识清楚地过滤为一行。但是,如果要访问不同查询中的所有字段,则结果将是可能导致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();  
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。您可以将行绑定到任何网格,而不会冒着遇到关于缺少成员的错误的风险。

+0

没有RePierre,它不工作。我得到错误,'System.Data.DataRow'不包含名为'Sid'的属性。当我尝试绑定gridview。 –

+0

@JuiTest,这很奇怪 - 为什么要寻找一个属性?它应该寻找名为'Sid'的属性而不是属性。 – RePierre

+0

,我用乌尔查询并转换成datatable.So我可以结合它的GridView –

相关问题