2012-09-22 18 views
2

我有一個方法,其中的對象列表。
之前持久化對象我不得不刪除其中的一些在某個給定的條件下過濾或從列表中刪除(Of T)

的如(不理想!):

一個公司可以有一個ID和分支的列表和請將isDeleted旗。
支鏈可以有一個ID和經理的列表和標誌請將isDeleted
經理可以有一個ID和一個標誌請將isDeleted
公司 - >分支機構 - >管理

請告訴我容易或過濾的最佳途徑ommit ID的組合= 0請將isDeleted和=真讓我可以遍歷該做細節 - 見下文

  • 那功能,如果該公司被標記爲Id = 0 and IsDeleted那麼我想ommit那完全是
  • 但如果只分公司被標記爲Id=0 and Isdeleted那麼公司應該是有沒有一個分公司
  • 如果只管理器matrked爲Id=0 and Isdeleted則本公司及分公司應該有

Private Function(comp as List(Of Company)) as Boolean 
    'filter comp here and pass it to for loop?? 
    Dim filteredList as ... 
    For each c as Company in filteredList 
    'do company specifis here 
     For each b as Branch in c.Branches 
     'do branch specific here 
      For Each m as Manager in b.Managers 
      'do manager specific here 
      Next 
     Next 
    Save(c) ' saves child objects as well  
    Next 
End Function 

回答

1

這會解決問題了嗎?

Dim filtererdComp = comp _ 
    .Where(Function(c) c.Id<>0 Or Not c.IsDeleted) 
    .ToList() 
For each c as Company in filtererdComp 
    c.Branches = c.Branches _ 
     .Where(Function(b) b.Id<>0 Or Not b.IsDeleted) _ 
     .ToList() 
    For each b As Branch in c.Branches 
     b.Managers = b.Managers _ 
      .Where(Function(m) m.Id<>0 Or Not m.IsDeleted) _ 
      .ToList() 
    Next 
Next 
+0

謝謝,我可以看到你正在過濾公司,我明白了。但filtererdComp仍然可以在分支中包含不需要的條目,所以我猜'c.Branches = c.Branches .Where(Function(b)b.Id <> 0或不b.IsDeleted).ToList()'重置分支到哪裏條件? – melspring

+0

首先我創建一個過濾的公司列表。然後,我將每個過濾的公司中的分支機構列表替換爲分支機構的過濾列表,最後,我將每個過濾分支機構中的每個經理列表替換爲過濾管理器的列表。結果是包含過濾管理器的過濾分支的過濾管理器列表。 –

+0

您是不是正在更改原始公司和分支對象?我不確定這是需要的。 – MarkJ

2

你可以使用Linq:

Dim filtered = From c In comp Where Not c.IsDeleted OrElse c.Id <> 0 
      From b In c.Branches Where Not b.IsDeleted OrElse b.Id <> 0 
      From m In b.Managers Where Not m.IsDeleted OrElse m.Id <> 0 
      Select New With {.Company = c, .Branch = b, .Manager = m} 

For Each x In filtered 
    Dim c As Company = x.Company 
    Dim b As Branch = x.Branch 
    Dim m As Manager = x.Manager 
Next 

,或者,如果你想列舉每種類型分別:

Dim filteredComp = From c In comp Where Not c.IsDeleted OrElse c.Id <> 0 
Dim filteredBranch = From c In filteredComp 
        From b In c.Branches Where Not b.IsDeleted OrElse b.Id <> 0 
        Select b 
Dim filteredManager = From b In filteredBranch 
        From m In b.Managers Where Not m.IsDeleted OrElse m.Id <> 0 
        Select m 

For Each c In filteredComp 

Next 
For Each b In filteredBranch 

Next 
For Each m In filteredManager 

Next 
0

在迭代的每個級別中,遍歷該級別上的所有現有元素。使用if語句來檢查ID = 0和IsDeleted是否爲真,在這種情況下刪除條目。

相關問題