选择对象的子子项

时间:2013-04-08 15:12:26

标签: c# entity-framework linq-to-sql linq-to-entities

成为linq和Entity Framework的新手,这让我很困惑:

我通过Entity Framework创建了我的数据库的一个模型(一小部分),其中三个表分为两个直接的1:n关系:文件夹 - > 1:n - > 合同 - > 1:n - > “测量”

我正在寻找一种语法,允许在我迭代的文件夹对象上启动并将该点(如果存在)返回到我在文件中找到的字符串,按名称进行比较。我想完全忽略中级合同,只需在所有合同中找到一个较低的点。

我可以通过迭代这样的每个合同来做到这一点:

foreach (Contract contract in folder.Contract)
{
    Point point = contract.Point.SingleOrDefault(p => p.Pointname == pointname);
    if (point != null)
    { ... other code
    }
}

我想跳过foreach over contract,但我无法正确理解语法。我试过这些:

Point point = folder.contract.SelectMany("???").Point.SingleOrDefault(p => p.Pointname == pointname)
Point point = folder.contract.All(c => c.Point.SingleOrDefault(p => p.Pointname == pointname))

两者都无法编译,但肯定有一种简单的方法可以做到这一点吗?

谢谢!

拉​​尔夫

1 个答案:

答案 0 :(得分:3)

我相信您需要以下代码:

Point point = folder.Contract
                    .SelectMany(c => c.Point)
                    .SingleOrDefault(p => p.Pointname == pointname)

但是,由于您检查每个合同中是否point != null,因此逻辑与您显示的内容有所不同。