【问题标题】:EF Code First oddity with Distinct()Distinct() 的 EF Code First 奇怪之处
【发布时间】: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


【解决方案1】:

我已将查询更新为:

var query = from worker in _context.Workers
            let distinctModules = worker.TakenTrainingModules.Select(module => module.TrainingModuleId).Distinct()
            where worker.TakenTrainingModules.Count != distinctModules.Count()
            select worker;

return query.Include(worker => worker.TakenTrainingModules).ToArray();

一切都很好。感谢Dismissile 为我指出了一个很好的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多