EF5检索嵌套导航属性

时间:2012-12-26 15:44:57

标签: linq-to-entities entity-framework-5 dbcontext

使用.Net Framework 4,VB.Net,EF5,DbContext

请考虑三个表及其生成的实体:

公司,员工,任务

任务有一个Employee的外键,Employee有一个外键给公司。

在部分类公司中,如何编写一个简单的查询来返回公司内的所有任务?

要获得所有任务,我现在正在使用这个冗长的例程:

Public ReadOnly Property Tasks As List(Of Task)
    Get
        Dim taskList = New List(Of Task)

        For Each e In Employees
            For Each t In e.Tasks
                taskList.Add(t)
            Next
        Next

        Return taskList
    End Get
End Property

它的表现非常糟糕。有没有更有效的方法来做到这一点?

谢谢。

2 个答案:

答案 0 :(得分:0)

使用LINQ的SelectMany函数(我会尝试在VB中执行此操作,但如果我错了,您可以查看here以获取SelectMany的示例):

taskList = _ Companies.SelectMany(Function(c) _ c.Employees.SelectMany(Function(e) e.Tasks)).ToList()

答案 1 :(得分:0)

由于我是在公司类的一个属性中写的,我想它是:

Return Employees.SelectMany(Function(e) e.Tasks).ToList

这样可以更有效地使用对象服务,因此我会将您的回复标记为“答案”。

然而,它的表现与我使用的循环一样糟糕。我将它归结为循环生成的SQL。我真的不喜欢描绘它并且看起来 - 我确定这是一团糟。

我所做的就是这个,在财产中:

Using context = New Entities
    Return context.Tasks.Where(Function(t) t.Employee.CompanyID = Me.CompanyID).ToList
End Using

这表现得很好。虽然我不确定从Model项目中查询上下文是否被认为是一种好的做法,但我决定走这条路。

非常感谢。