我使用EF模型的导航属性查找性能问题。
我的模型是这样的(概念上):
public class Company
{
public int ID { get; set; }
public string CompanyName { get; set; }
public EntityCollection<Employee> Employees { get; set; }
}
public class Employee
{
public int CompanyID { get; set; }
public string EmployeeName { get; set; }
public EntityReference<Company> CompanyReference { get; set; }
}
现在让我们说我想获得所有拥有(已知)员工的公司的列表。
此外,假设我已通过之前的通话缓存了公司和员工的列表:
var dbContext = new EmploymentContext();
var allCompanies = dbContext.Companies.ToList();
var allEmployees = dbContext.Employees.ToList();
bool activeCompanies =
allCompanies.Where(company => company.Employees.Any()).ToList();
这(在我的环境中)在 Employees 导航属性之后为每个 .Any()调用生成一个新的SQL语句。
我已经在缓存列表中拥有了我需要的所有记录,但是他们并没有连接到&#39;在客户端彼此。
我意识到我可以添加.Include()调用我的初始cache-fill语句。我想避免这样做,因为在我的实际环境中,我有大量的关系和大量的列表,我预先填充。我主要是为了阻止Linq生成过于复杂的嵌套SQL语句而导致数据库服务器陷入困境。
我也意识到我可以修改我的查询以便进行内存中连接:
bool activeCompanies = allCompanies.Where
(
company => allEmployees.Any(employee => employee.CompanyID == company.ID)
);
我试图避免做这样的重写,因为实际的业务逻辑变得相当复杂。使用Linq语句显着提高了这种逻辑的可读性,如果可能的话,我不想丢失它。
所以我的问题是:我能以某种方式手动将它们连接在一起,就像实体框架将它们连接起来一样吗?
我想继续使用 .Any()运算符,但我希望它只检查我在 dbContext 中的内存对象 - 无需重复返回数据库。