【问题标题】:LINQ to SQL: How to check if any item in one entity collection exists in another entity collection?LINQ to SQL:如何检查一个实体集合中的任何项目是否存在于另一个实体集合中?
【发布时间】:2011-07-03 16:52:47
【问题描述】:

我正在使用 MVC2 和实体框架。

我有 2 个实体集合,我需要比较它们并检查它们是否有任何共同点。例如,假设我有EntityCollection<Candidate>EntityCollection<Job>。我正在尝试返回所有具有工作首选技能中列出的技能的候选人。这是正确的:

public IQueryable<Candidate> GetMatchingCandidates(Job job)
{                
     return from candidate in _db.Candidates
     where (candidate.CandidateSkills.Where(c => job.JobPreferredSkills.Any(j => j.SkillId== c.SkillId)).Count() > 0) 
     select candidate;                                
}

同样,我也希望获得具有首选技能中列出的所有技能的候选人。

【问题讨论】:

    标签: .net asp.net-mvc linq entity-framework linq-to-sql


    【解决方案1】:

    我会在第一种情况下使用Any()

        public IQueryable<Candidate> GetMatchingCandidates(Job job)
        {
            return from candidate in _db.Candidates
                   where (candidate.CandidateSkills.Any(c => job.JobPreferredSkills.Any(j => j.SkillId == c.SkillId)))
                   select candidate;
        }
    

    然后在您的第二种情况下使用All()(所有技能都必须在首选技能中)

        public IQueryable<Candidate> GetMatchingCandidates(Job job)
        {
            return from candidate in _db.Candidates
                   where (candidate.CandidateSkills.All(c => job.JobPreferredSkills.Any(j => j.SkillId == c.SkillId)))
                   select candidate;
        }
    

    【讨论】:

    • 另外,我怎么能做一个我想在所有项目上匹配的项目(与任何项目相比)?
    • @Prabhu:ALL 案例是我的第二个例子,还请注意,我将第一个案例中的 .Where(...).Count() &gt; 0 替换为 Any(..)
    • 太棒了,不知道他们有一个 All :-) 是的,我注意到 Any 替代品——事实上我一开始就是这样,但出于某种原因改变了它。所以你认为这是正确的策略吗?我不确定的部分是将查询作为外部查询的参数。
    • 我觉得很好,你应该检查生成的 SQL 并做一些基本的性能测试,看看是否需要进一步优化
    • 我试过了,但我得到了这个错误::无法创建类型为“JobPreferredSkill”的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。有什么建议么?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多