DataTableの階層データに対して自己参照選択を行う方法

ReportIdとParentReportIdの2つの列を持つDataTableがあります。親が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
追加された
ちょうどメモ:私はいつもVBでそうするつもりはないので、C#の人々がなぜDataTableのLINQクエリに明示的に AsEnumerable()を書いているのか疑問に思ってきました。今私はこれが(いくつかの)VB.NETの利点の1つであることを知っています(通常VBはより冗長です): blogs.msdn.com/b/vbteam/archive/2008/05/14/…
追加された 著者 Tim Schmelter,
私は数分前に答えを更新しました.dt.AsEnumerable()を実行する必要があります。どこで()
追加された 著者 Dylan Smith,
dt.Rowsには.Where()メソッドがありません。私は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
追加された