2010-01-14 111 views
1

我正在開發POS系統,我需要檢查每個終端上的數據庫表是否不同步。使用LINQ查詢嵌套字典

我維護一個終端信息字典,其中每個字典都包含帶有每個表的CRC的表id。下面是我到目前爲止得到了簡化描述(我用VB.NET,但我已經去掉了很多東西,希望能夠澄清的東西):

e.g. TerminalList = Dictionary(Of Integer, TerminalInfo) 

     class TerminalInfo 
     TerminalID: Integer 
     TableCRCs: Dictionary(Of String, TableInfo) 

     class TableInfo 
     TableID: String 
     CRC: UInt32 


     TerminalID: 1 
      TableID: A CRC: aa10 
      TableID: B CRC: 1234 

     TerminalID: 2 
      TableID: A CRC: aa10 
      TableID: B CRC: 1234 

     TerminalID: 3 
      TableID: A CRC: 12be 
      TableID: B CRC: 1234 

是否有可能爲我創造一個LINQ查詢,將建立一個不同的TableID和CRC的列表?

i.e. A aa10 
    A 12be 
    B 1234 

如果此查詢的計數大於我感興趣的表的數量,則我知道終端不同步。我對哪個終端或哪個表不同步感興趣,只是有所不同。

TIA,

西蒙

回答

2

肯定。所以我希望C#是好的,你沒有指定語言(我用不流利的VB.NET,但我可以幫你,如果你需要幫助翻譯):

var query = TerminalList.SelectMany(kvp => kvp.Value.TableCRCs.Values) 
         .GroupBy(info => new { info.TableID, info.CRC }); 

foreach (var result in query) { 
    Console.WriteLine(
     String.Format(
      "{0}|{1:x}", 
      result.Key.TableID, 
      result.Key.CRC 
     ) 
    ); 
} 

這裏的關鍵是使用SelectMany將嵌套枚舉TerminalInfo s變成一個枚舉。從那裏只需要通過GroupBy操作即可獲得理想的結果。

+0

正是我需要的。非常感謝你。 – 2010-01-21 17:13:10