使用Linq获取子记录

时间:2013-05-01 02:55:19

标签: c# linq linq-to-sql

这是我第一次听到LINQ,我对此一无所知。请温柔我。

我有这组数据。

+---------+--------+---------------+
| RadioID | NodeID | SourceRadioID |
+---------+--------+---------------+
| R0      |      1 |               |
| R1      |      1 |               |
| R2      |      1 |               |
| R3      |      1 |               |
| R4      |      1 |               |
| R5      |      2 |               |
| R6      |      2 |               |
| R7      |      2 | R0            |
| R8      |      2 |               |
| R9      |      2 |               |
| R10     |     11 |               |
| R11     |     11 | R9            |
| R12     |     11 |               |
| R13     |     11 |               |
+---------+--------+---------------+

我需要做的是编写一个返回NodeID列表的方法。例如,

List<int> dependentNode = GetChildNode(1); // int ParentNode

我的预期结果是NodeID:2 and 11

包含

NodeID = 2是因为RadioID = R7RadioID = R0相关联,属于NodeID = 1

还包括

NodeID = 11,因为RadioID = R11已连接到属于Radio = R9的{​​{1}}(也连接到NodeID = 2 )。

我查了这篇文章,但我总是得到NodeID = 1

这是完整的代码:

StackOverFlowException

您可以建议是否有更好的方法来做到这一点。抱歉新手在这里。

1 个答案:

答案 0 :(得分:2)

如果你是新手,不要对递归和lambdas过于聪明。

    public List<int> GetChildren(int id)
    {
        var nodes = GetRadio();
        var parent = nodes.Single(n => n.NodeID == id);
        var children = nodes.Where(n => n.SourceRadioID == parent.RadioID).Select(n => n.NodeID);

        return children.Union(children.SelectMany(GetChildren)).ToList();
    }

更新1

public List<int> GetChildren(int id)
{
    IEnumerable<RadioEntity> parent = GetRadio().Where(x => x.NodeID == id);
    IEnumerable<int> children = (
                                    from r in GetRadio()
                                    where parent.Select(x=>x.RadioID)
                                                .Contains(r.SourceRadioID)
                                    select r
                                ).Select(n => n.NodeID);

    return children.Union(children.SelectMany(GetChildren)).ToList();
}