2014-10-16 108 views
2

我有一个非常简单的(代码优先)模式:实体框架 - 不当的2条select语句代替连接

员工

[Table("vEmployee")] //note v - it's a view 
public class Employee 
{ 
    [Key] 
    public int EmployeeNumber { get; set; } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

EmployeeHolidayEntitlement

[Table("tblEmployeeHolidayEntitlement")] 
public class EmployeeHolidayEntitlement 
{ 
    [Key] 
    public int EmployeeNumber { get; set; } 

    public virtual Employee Employee { get; set; } 

    public decimal StandardEntitlement { get; set; } 

    //.....omitted for brevity 
} 

请注意,EmployeeHolidayEntitlement映射到at能和员工被映射到一个视图

当建立我的背景,我做的:
(不知道这是正确的!)

modelBuilder.Entity<Employee>() 
    .HasOptional(x => x.HolidayEntitlement) 
    .WithRequired(x => x.Employee); 

现在,当我查询,像这样:

var db = new ApiContext(); 
var result = db.Employees.ToList(); 

这很慢。

如果我期待在SQL事件探查器,我可以看到,而不是一个声明(加盟vEmployee和tblEmployeeHolidayEntitlement)我得到很多的语句执行(每员工记录之一) - 例如:

首先,它从选择vEmployee

SELECT 
    [Extent1].[id] AS [EmployeeNumber], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[LastName] AS [LastName], 
    FROM [dbo].[vEmployee] AS [Extent1] 

那么这些为每个记录一个返回

exec sp_executesql N'SELECT 
    [Extent1].[EmployeeNumber] AS [EmployeeNumber], 
    [Extent1].[StandardEntitlement] AS [StandardEntitlement] 
    FROM [dbo].[tblEmployeeHolidayEntitlement] AS [Extent1] 
    WHERE [Extent1].[EmployeeNumber] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=175219 

这似乎不是我的权利 -

我会想到它应该沿左线做一些更多的JOIN像

SELECT * 
    FROM [dbo].[vEmployee] employee 
    LEFT JOIN 
    [dbo].[tblEmployeeHolidayEntitlement employeeEntitlement 
    ON 
    employee.id = employeeEntitlement.employeenumber 

回答

2

你必须使用的方法包括,如db.Employees.Include(e => e.HolidayEntitlement).ToList()。如果你不这样做,并且你访问该属性,你将触发延迟加载。这就是发生在你身上的事情。

For more information check the documentation on loading。它的缺点是,如果它总是加入你的整个对象图,那将会是无法接受的缓慢。

+0

关于.Include,我不能指定一个lambda,它想要一个字符串? – Alex 2014-10-16 19:24:09

+2

@Alex您需要使用'using'语句来访问'.Include'的lambda超载,请参阅:http://stackoverflow.com/a/10079815/84206 – AaronLS 2014-10-16 19:25:14

+1

您使用的是EF6吗? lambda重载更新,但字符串重载做同样的事情...看到这里:http://msdn.microsoft.com/en-us/library/system.data.entity.dbextensions.include(v=vs。 103).aspx – Casey 2014-10-16 19:25:28