如何仅获取数据表中具有相同ID的最新条目?

| 我有以下几点:
DataTable table = new DataTable();
table.Columns.Add(\"id\", typeof(string));
table.Columns.Add(\"date\", typeof(DateTime));

DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
DateTime date2 = new DateTime(2007, 3, 1, 7, 0, 0);
DateTime date3 = new DateTime(2006, 3, 1, 7, 0, 0);

table.Rows.Add(\"123\", date1);
table.Rows.Add(\"123\", date2);
table.Rows.Add(\"ABC\", date3);
我想执行一个操作,该操作将删除与另一行具有相同ID的所有行,并仅保留具有最新日期的行。 在开始的这个小例子中,我有:
123 2008...
123 2007...
ABC 2006...
采取行动后应为:
123 2008...
ABC 2006...
我怎么能意识到这一点? (这只是一个小例子,我的真实数据要大得多)     
已邀请:
        假设您不能直接在数据源处过滤数据(=调整SQL查询),则可以使用以下代码删除行:
var multiDates = from dr in table.AsEnumerable()
                 group dr by dr.Field<string>(\"id\") into grp
                 where grp.Count() > 1
                 select grp.OrderByDescending(gr => gr.Field<DateTime>(\"date\"));

var toDelete = multiDates
    .SelectMany(rows => rows.Skip(1))
    .ToArray();

foreach (var row in toDelete)
    row.Delete();

table.AcceptChanges();
    
        如果您希望在插入所有数据之后进行检查,则可以使用DataView对DataTable数据进行排序,枚举任何行,检查重复项并删除它们。
DataView dv = new DataView(DATA_TABLE, \"\", \"ID, Date DESC\", DataViewRowState.None);
for (int i = 1; i < dv.Count; i++)
{
    if (dv[i - 1].Row[\"ID\"] == dv[i].Row[\"ID\"])
    {
       dv[i].Delete();
       i--;
    }
 }
如果您可以检查插入,请使用例如EndEdit_Event之类的方法来检查重复的ID 您甚至可以考虑使用某种数据源(ArrayList,List,DataSet aso)并使用约束或某些businessLogic检查。     
        这是一种选择
 var rowsToDelete = 
              (from outer in table.AsEnumerable()
              where !(from inner in table.AsEnumerable()
                    group inner by inner.Field<string>(\"id\") into grp
                    where grp.Key == outer.Field<string>(\"id\") &&
                          grp.Max (g => g.Field<DateTime>(\"date\")) == outer.Field<DateTime>(\"date\")
                    select grp.Key).Any()
              select outer).ToList();

foreach (var row in rowsToDelete) 
   row.Delete();
table.AcceptChanges();
    
        您可以使用linq查询不同的字段ID,如下所示
var MyQry=(from P5 in table.AsEnumerable() select P5[\"id\"]).Distinct().ToList();
for (int O1 = 0; O1 < MyQry.Count; O1++)
{
     richTextBox1.Text = MyQry[O1].ToString();
}
    

要回复问题请先登录注册