2013-01-08 6 views
0

J'ai deux DataTables qui ont des colonnes différentes mais une colonne est la même.C# LINQ DataTable soustraction

Je veux obtenir un nouveau DataTable qui contient une ligne de dt1 qui n'existe pas dans dt2.

comment puis-je le faire en utilisant LINQ?

qui est mon code actuel, mais il ne fonctionne que pour datatables avec les mêmes colonnes:

private void Delete_HPM_Deleted_Points(int YellowCard_Request_ID) 
{ 
    DataTable dt_hpm_points_DB = DataAccessLayer.Get_YellowCard_Request_HPM_Points(YellowCard_Request_ID); 
    //dt_hpm_points_DB.Columns.Remove("HPM_Tool_ID"); 
    //dt_hpm_points_DB.Columns.Remove("HPM_Point_Message"); 
    //dt_hpm_points_DB.Columns.Remove("HPM_Point_isDisabled"); 
    //dt_hpm_points_DB.Columns.Remove("HPM_Point_Comments"); 

    DataTable dt_hpm_points_Local = UserSession.Get_User_YC_HPM_Added_Points_DATATABLE(); 
    //dt_hpm_points_Local.Columns.Remove("HPM_Tool_ID"); 
    //dt_hpm_points_Local.Columns.Remove("HPM_Point_Message"); 

    //var rowsInFirstNotInSecond = dt_hpm_points_DB.Rows.Where(r1 => !dt_hpm_points_Local.Rows.Any(r2 => r1.ID == r2.ID)); 

    DataTable dt_points_to_remove = dt_hpm_points_DB.AsEnumerable().Except(dt_hpm_points_Local.AsEnumerable(), DataRowComparer.Default).CopyToDataTable(); 

    foreach (DataRow dr in dt_points_to_remove.Rows) 
    { 
     DataAccessLayer.Delete_YellowCard_Request_HPM_Point(YellowCard_Request_ID, dr["HPM_Point_ID"].ToString()); 
    } 
} 

Répondre

1

Vous pouvez utiliser Linq-To-DataSet avec une "gauche jointure externe":

var justInDT1 = from r1 in dt1.AsEnumerable() 
       join r2 in dt2.AsEnumerable() 
       on r1.Field<int>("PK_ID") equals r2.Field<int>("FK_ID") into GJ 
       from subRow in GJ.DefaultIfEmpty() 
       where subRow == null 
       select r1; 

How to: Perform Left Outer Joins (C# Programming Guide)

+0

Si vous voulez un nouveau 'DataTable' à partir du résultat, utilisez' justInDT1.CopyToDataTable() ' –