2011-09-14 6 views
1

私は以下のデータテーブルを持ち、ユニット情報を持っています。単位の面積は平方メートルです。 ユニットはサブユニットに分割できますが、データユニットにはユニットが分割されているかどうかを知るためのParentUnitIDがあります。同じデータテーブルを使用する子ユニットの合計を検証する複雑なlinqクエリ

子ユニットのサーフェスの合計が親ユニットのサーフェスと等しいことを検証する必要があります。私はLINQでこれをしたいと思っ

private void ValidateUnitsStep(WorkspaceCancelEventArgs e) 
{ 
    //Get data from step 
    GetUnitsData(); 
    UserControlUnits Units = GetSmartPartByType<UserControlUnits>(); 

    if (_unitDataSet.Unit.HasErrors) 
    { 
     e.Cancel = true; 
    } 

    DataRow[] rows = _unitDataSet.Unit.Select("ParentUnitId !=" + string.Empty); 
      foreach(DataRow dr in rows) 
    { 

    } 
} 

enter image description here

現在のコードのようなものです。 Linq Complex Query

編集: はい、チャイルズの2つのレベルまで、また可能厥のみ

ユニットA(100平方メートル)

-UnitA1(70)

-UnitA11 (20) 

    -UnitA12 (20) 

    -UnitA12 (30) 

-UnitA2( 30)

-UnitA21 (20) 

    -UnitA22 (10) 
+1

を使用すると、子機は、今度は両親できますか? –

+0

はい、チャイルズの2つのレベルのみ ユニットA(100平方メートル) -UnitA1(70) -UnitA11(20) -UnitA12(20) -UnitA12(30) -UnitA2(までも可能厥30) -UnitA21(20) -UnitA22(10) –

+0

申し訳ありませんが、私は整理しようとしましたが、コメントは定型化を許可しません、私は質問を編集しました。 –

答えて

1

可能な実装linq to DataSet

(子供の1つのレベルが、私はあなたが2つのレベルのために働くことができると確信している)

// Group the records by parent ID (potentially null) 
var childrenByParentID = _unitDataSet.Unit.AsEnumerable(). 
         ToLookup(child => child.Field<int?>("ParentUnitId")); 

// Parents = children with no parent 
var parentsByID = childrenByParentID[null].ToLookup(parent => parent.Field<int>("UnitID")); 

// Look for the first group which sum of surfaces is not the same as the parent's surface 
var invalidGroup = childrenByParentID.FirstOrDefault(group => 
{ 
    bool invalid = false; 

    if (group.Key != null) 
    { 
    // Not the parents group 
    var currentParent = parentsByID[group.Key]); 

    var totalSurface = group.Sum(row => row.Field<int>("Surface")); 
    invalid = (totalSurface != currentParent.Field<int>("Surface")); 
    } 

    return invalid; 
}); 

if (invalidGroup != null) 
{ 
    // .. do something special 
} 
+0

私はいくつかのコンパイラエラーがあります。私は質問にスクリーンショットを追加しました。 System.Data.Linqは既に存在します。 –

+1

@ルイス私はソースコードを修正しました(私は試していませんでした) –

+1

@Luis、ソースコードが更新され、多くのユニットがあればパフォーマンスが向上しました... –

関連する問題