用于selectmany + join + let的LINQ查询语法

时间:2015-08-07 05:52:00

标签: c# linq

我想将命名数据字典列表与从数据提供程序读取的实际数据进行比较。结果应为以下格式的 flat 列表: [表]:[Key]从[OldValue]更改为[NewValue]。

我想使用linq的查询语法,不需要性能。 具有相同名称的词典总是具有相同的键,不需要进行检查。

我提出了以下查询(您可以在LINQ-Pad中使用它)但我无法在第一次连接中访问table2。错误:“名称'table2'在当前上下文中不可用”(第8行)。

有什么想法吗?

void Main()
{
    var db1 = new[] { new Table { Name = "TableA", Data = new Dictionary<string, string> { { "KeyA", "000" } } } };

    var changes = from table1 in db1
                let table2 = ReadTable(table1.Name)
                from row1 in table1.Data
                join row2 in table2.Data
                    on row1.Key equals row2.Key
                where !row1.Value.Equals(row2.Value)
                select new { Table = table1.Name, Key = row1.Key, From = row1.Value, To = row2.Value };

    changes.Dump(); 
}

Table ReadTable(string Name)
{
    return new Table { Name = "TableA", Data = new Dictionary<string, string> { { "KeyA", "111" } } };
}

class Table
{
    public string Name { get; set; }
    public Dictionary<string, string> Data { get; set; }
}

1 个答案:

答案 0 :(得分:6)

连接点是在两个独立数据源中查找匹配元素。换句话说,连接右侧的元素不能依赖于&#34; current&#34;左手边的连接。因此,当您平展时,您无法加入。你只需要有效地隔离&#34;给出两个表,找出差异&#34;部分,然后展平那些结果。我相信这会做你想要的:

var changes = from table1 in db1
              let table2 = ReadTable(table1.Name)
              from change in
                  (from row1 in table1.Data
                   join row2 in table2.Data
                     on row1.Key equals row2.Key
                   where !row1.Value.Equals(row2.Value)
                   select new 
                          { 
                             Table = table1.Name, 
                             Key = row1.Key, 
                             From = row1.Value, 
                             To = row2.Value 
                          })
              select change;