使用LINQ查询嵌套字典

时间:2010-01-14 18:24:43

标签: .net linq

我正在开发POS系统,我需要检查每个终端上的数据库表是否不同步。

我维护一个终端信息词典,每个词典都包含包含表id的Dictionary,每个表都有一个CRC。下面简要介绍了我到目前为止所做的事情(我使用的是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,

西蒙

1 个答案:

答案 0 :(得分: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
        )
    );
}

关键是使用SelectManyTerminalInfo的嵌套枚举展平为一个枚举。从那里开始,只需通常的GroupBy操作即可获得所需的结果。