我有一个非常简单的(代码优先)模式:实体框架 - 不当的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
关于.Include,我不能指定一个lambda,它想要一个字符串? – Alex 2014-10-16 19:24:09
@Alex您需要使用'using'语句来访问'.Include'的lambda超载,请参阅:http://stackoverflow.com/a/10079815/84206 – AaronLS 2014-10-16 19:25:14
您使用的是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