【发布时间】:2014-04-07 12:18:42
【问题描述】:
下面的代码有一些我不完全理解的东西。我正在尝试查找在其模块集合中具有重复模块的工作人员。
以下是实体(为简洁起见进行了简化):
public class Worker
{
public int Id { get; private set; }
public ICollection<TakenTrainingModule> TakenTrainingModules { get; private set; }
public Worker()
{
TakenTrainingModules = new HashSet<TakenTrainingModule>();
}
}
public class TakenTrainingModule
{
public int Id { get; set; }
public int TrainingModuleId { get; set; }
}
这是查询:
var query = from worker in _context.Workers.Include(worker => worker.TakenTrainingModules)
let distinctModules = worker.TakenTrainingModules.Select(module => module.TrainingModuleId).Distinct()
where worker.TakenTrainingModules.Count != distinctModules.Count()
select worker;
使用下面的查询,返回的工作人员的 TakenTrainingModules 集合为空。
但是,通过下一个查询(不使用键 let),集合已完全正确加载:
var query = from worker in _context.Workers.Include(worker => worker.TakenTrainingModules)
where worker.TakenTrainingModules.Count != worker.TakenTrainingModules.Select(module => module.TrainingModuleId).Distinct().Count()
select worker;
我错过了什么? let 关键字是否首先执行不同的查询并欺骗对象状态管理器,认为模块已加载但未加载,并且选择器接下来不会加载它们?
欢迎任何解释! :-)
【问题讨论】:
-
感谢您的链接!
标签: linq entity-framework ef-code-first