Як зрабіць самоссылающийся выбар іерархічных дадзеных у DataTable?

У мяне ёсць DataTable с, скажам, дзве калонкі: ReportID і ParentReportId. Я хачу, каб выбраць усе справаздачы, бацькі якіх не былі згаданыя ў DataTable. Я хачу зрабіць нешта накшталт гэтага (дастаўшы з сінтаксісу SQL), але я ведаю, што гэта не працуе:

DataRow[] foo = drParentRow = dt.Select("ParentReportId NOT IN(ReportId)");

Як я магу атрымаць гэтыя запісы з гэтага набору дадзеных у гэтай сітуацыі?

0

2 адказы

var noParents = dt.AsEnumerable().Where(x => x["ReportParentID"] != DBNull.Value && 
                                      !dt.rows.Any(y => y["ReportID"] == x["ReportParentID"]);
0
дададзена
Проста да ведама: Я заўсёды задаваўся пытаннем, чаму C# людзі пішуць AsEnumerable() у сваіх відавочна запытаў LINQ на DataTables, таму што я не вымушаны зрабіць гэта ў VB. Цяпер я ведаю, што гэта адзін з (нямногіх) VB.NET пераваг (як правіла, VB больш падрабязна): blogs.msdn.com/b/vbteam/archive/2008/05/14/…
Я абнавіў адказ некалькі хвілін таму, вы павінны зрабіць dt.AsEnumerable (). Дзе ()
дададзена аўтар Dylan Smith, крыніца
dt.Rows не мае метаду з .гдом (). Я выкарыстоўваю System.Data і System.Linq.
дададзена аўтар Chris Miller, крыніца

Я думаю, што вы будзеце мець, каб выкарыстоўваць некаторыя LINQ для гэтага:

var reportIds = dt.AsEnumerable().Select(row => row.Field("ReportId"));

var foo = from row in dt.AsEnumerable()
          let parentReportId = row.Field("ParentReportId")
          where !reportIds.Contains(parentReportId)
          select row;
0
дададзена