【问题标题】:LINQ to SQL Query for Many-to-Many relationship多对多关系的 LINQ to SQL 查询
【发布时间】:2021-05-03 22:16:44
【问题描述】:

我正在将一个旧的 ASP.net (C#) 应用程序从普通 SQL 查询迁移到 LINQ to SQL,并且在处理一些更复杂的查询时遇到了一些问题。在这种情况下,我试图获取具有特定技能的员工列表。用户选择要搜索的技能,并将 ID 提供给执行该工作的方法。在旧的 SQL 版本中,我只是将 WHERE 子句附加到每个技能的字符串中。这是一个示例查询:

SELECT DISTINCT e.firstname, e.lastname, e.username
FROM employees AS e
WHERE e.id IN (SELECT es.emp_id 
FROM emp_skl AS es 
WHERE es.skl_id = 6 OR es.skl_id = 11 
GROUP BY es.emp_id
HAVING COUNT(es.emp_id) >= 2)

关键是 HAVING COUNT 子句,因为它确保返回的员工拥有所有技能,而不仅仅是一项技能。无论如何,有人可以帮我把它变成一个可靠的 LINQ 查询吗?

【问题讨论】:

  • 发布架构图的好举措。

标签: c# linq linq-to-sql


【解决方案1】:

首先,最好不要以“S”结尾。

现在是代码,假设你已经有一个函数,你会得到一个技能列表:

IQueryable<skills> listSkills = getSkills();
IQueryable<employees> listEmployees = db.employees;

foreach(var skill in listSkills)
{
    listEmployees=listEmployees
        .Where(p=>p.emp_skls.Any(q=>q.skl_id==skill.id));
}

编辑:

例如:

public IQueyable<skills> getSkills()
{
    return db.skills.Where(p=>p.id==6 || p.id==1);
}

【讨论】:

  • 复数表名是一个巨大的争论。有些人会认为表示对象的行集合应该是复数形式。
  • 是的......我的意思是,这只是从 linq 的角度来看......因为它在实体和表中的实体之间变得模棱两可
【解决方案2】:

这是您的 SQL 查询的 LINQ 翻译:

from e in Employees
where e.Emp_Skls.Count (es => es.Skl_id == 6 || es.skl_id == 11) >= 2
select new
{
  e.FirstName, e.LastName, e.UserName
}

但是,如果您想要的查询是“给我同时具备技能 6 和 11 的员工”,那么如果技能 6 或 11 出现两次,您的 SQL 查询将失败(我认为这是可能的,因为您有 >= 2 而不是 =2 在你的有条款)。在这种情况下,以下查询更适合:

from e in Employees
where e.Emp_Skls.Any (es => es.Skl_id == 6) &&
      e.Emp_Skls.Any (es => es.Skl_id == 11)
select new
{
  e.FirstName, e.LastName, e.UserName
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2020-10-14
    • 2013-06-27
    相关资源
    最近更新 更多