我正在开发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,
西蒙
答案 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
)
);
}
关键是使用SelectMany
将TerminalInfo
的嵌套枚举展平为一个枚举。从那里开始,只需通常的GroupBy
操作即可获得所需的结果。