2017-04-06 144 views
0

是否有可能通過LINQ來迭代兩個集合?迭代兩個集合LINQ

我有一個ObservableCollection我想填補,現在我只是使用你的典型foreach循環。

我使用一個循環來遍歷一個string數組,而不是使用該值,我檢查每個bool值是否爲true並將該值添加到Collection。

public ObservableCollection<StaffInfo> Display = new ObservableCollection<StaffInfo>(); 

    public void MasterDataDisplay() 
    { 
     string[] data = new[] {"a", "b", "c"}; 

     foreach (var section in data) 
     { 
      var filter = Db.StaffInfos.Where(p => p.Section == section); 
      foreach (var item in filter) 
      { 
       if (item.CurrentStaff == true) 
       { 
        Display.Add(item); 
       } 
      } 
     } 
    } 

是否有可能通過單個LINQ查詢來做這種事情?或者是我正在做的最好的方式來做到這一點?

+0

您沒有循環收集 - 您正在查詢數據庫中的各個值。你爲什麼不把你的循環轉換成一個查詢? –

+0

使用Join方法來組合兩個集合。看到msdn:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

回答

3

當然。你基本上是尋找項目,其中CurrentStaff屬性爲true和Section屬性包含在data集合中:

Display = new ObservableCollection<StaffInfo>(
       Db.StaffInfos 
        .Where(p => p.CurrentStaff == true 
          && data.Contains(p.Section)) 
      ); 

的好處約Contains的是,它會在SQL的IN條款,這樣你就可以得到您的數據在一個查詢中而不是3個。

+0

紫外線感謝,我從來沒有想過使用'contains'那樣。 – KyloRen

+0

你如何引用'AddRange'來觀察集合? – KyloRen

+0

@KyloRen對不起,看我的編輯。您需要使用構造函數以一次性添加數據(與通過循環調用「Add」)。 –

1

您的代碼從數據庫中讀取數據並檢查其值。你並不需要循環做到這一點,只是重寫代碼來執行一個查詢:

var items=from item in Db.StaffInfos 
      where data.Contains(item.Section) && item.CurrentStaff 
      select item; 
Display.AddRange(items); 

或等價的:

var items=Db.StaffInfos 
      .Where(item => data.Contains(item.Section) && item.CurrentStaff); 
Display.AddRange(items); 

的「貓膩」這裏是someData.Contains(field)。包含被轉換爲field IN (data1, data2,data3)子句

+0

+1,這真的很清楚如何做這樣的事情。由於我發佈的查詢只是一個簡化的查詢。謝謝。 – KyloRen

+0

@KyloRen你應該對待任何包含數據訪問的循環,像熱土豆。幾乎總是有一種方法可以將它轉換爲僅執行一次往返的單個查詢。否則,您最終會收到N個遠程呼叫 –