创建一个查询交叉连接多个表

时间:2016-08-02 01:38:29

标签: c# cross-join

有2个表格: A - [Id],[标题] B - [Id],[Caption],[AId] - 其中[AId] - 表A的键(一对多) 假设我们在表格中有以下数据:

А:

Id | Caption 
----------
1  |  Format 
2  |  Material 
3  | PrintMode 

В:

Id | Caption | Aid 
------------------
1  | A5      | 1 
2  | A4      | 1 
3  | A3      | 1 
4  | Mud     | 2 
5  | Paper   | 2 
6  | Single  | 3 
7  | Double  | 3

假设我们想要提取数据格式和内容,并将参数传递给两个实体的函数List,因为输出应该如下所示:

一些交叉数据

A5 | Mud 
A5 | Paper 
A4 | Mud 
A4 | Paper 
A3 | Mud 
A3 | Paper  

当我们想要提取这样的数据格式,材料和模式时,它变得更加困难。作为输出的结果传递给三个实体的函数参数List应该如下所示:

一些交叉数据

A5 | Mud   | Single 
A5 | Mud   | Double 
A5 | Paper | Single 
A5 | Paper | Double 

等等。表A课程不限于3个录音。这样的事情。除了[Some Cross Data]列类型字符串之外,生成的样本仍应包含一个列(例如[dict]类型List),该列将包含一个列表和2个实体B(参见。示例1)和3个实体(请参阅例2)等。

private static List<Data> ProcessData(IReadOnlyList<Property> list)
{ 
    var z3 = list[0].PropertyValues
        .SelectMany(x => list[1].PropertyValues, (a, b) => new { a, b })
        .SelectMany(x => list[2].PropertyValues, (z, c) => new { z.a, z.b, c })
        .SelectMany(x => list[3].PropertyValues, (y, d) => new { y.a, y.b, y.c, d });

    return z3.Select(item => new Data 
    { 
        Name = $"{item.a.Name} {item.b.Name} { item.c.Name}\t{item.d.Name}", 
        PropertyValues = new List<PropertyValue>
        {
            item.a, item.b, item.c, item.d
        }
    }).ToList();
}

代码执行其任务,但是一旦明确它只适用于list.Count == 4 ...我们当然可以创建很多函数并调用它们,具体取决于条目的数量。列表 - 但它只是超级峰值。

帮助创建查询...

0 个答案:

没有答案