C# 有没有办法从多个表中检索基于multple where的数据

C# 有没有办法从多个表中检索基于multple where的数据,c#,asp.net,asp.net-mvc,entity-framework,.net-core,C#,Asp.net,Asp.net Mvc,Entity Framework,.net Core,我已经尝试了一段时间,用各种可能的方式来做到这一点。我有表名员工和其他表名资格 每个员工都有资格,但在最初的基础上,每个员工的资格尚未填入数据库 我也尝试过通过EF和LINQ以及rawSqlConnection和SqlCommand进行测试,但仍然没有得到好的结果 拥有博士学位的员工由 ViewData["lecturer_phd"] = _context.TblQualification .Count(q

我已经尝试了一段时间,用各种可能的方式来做到这一点。我有表名员工和其他表名资格

每个员工都有资格,但在最初的基础上,每个员工的资格尚未填入数据库

我也尝试过通过EF和LINQ以及raw
SqlConnection
SqlCommand
进行测试,但仍然没有得到好的结果

拥有博士学位的员工由

ViewData["lecturer_phd"] = _context.TblQualification
                                   .Count(q => q.QualificationType == 4 && 
                                               q.Employee.DesignationCode == 3);
而非博士生也应该带着

ViewData["lecturer_nphd"] = _context.TblEmployees
                                    .Count(e => e.DesignationCode == 3 && 
                                                e.EmployeeQualifications.Any(q => q.QualificationType != 4));
但这不起作用,我也不熟悉LINQ,但我也尝试过,没有任何结果

原始SQL查询使用以下代码:

SqlConnection con = new SqlConnection(_context.Database.GetConnectionString());

DbCommand cmd = new SqlCommand("SELECT Count(*) FROM [DbBzuCC].[dbo].[tblEmployees] LEFT JOIN tblQualifications ON tblEmployees.Employee_Code = tblQualifications.Employee_Code AND tblQualifications.qualification_type != 4  WHERE tblEmployees.Designation_Code = 3",
                               con);

con.Open();
ViewData["lecturer_nphd"] = (int) cmd.ExecuteScalar();
con.Close();

但这一切都是徒劳的。任何帮助都将不胜感激。我将感谢社区的任何帮助。提前感谢

实际上,资格认证类型为空,没有为任何员工输入,因此在sql查询中,我们需要检查

是这样吗

SELECT COUNT(*)
  FROM [DbBzuCC].[dbo].[tblEmployees]
  Left join tblQualifications ON tblEmployees.Employee_Code = tblQualifications.Employee_Code
  WHERE tblEmployees.Designation_Code = 3 AND ISNULL(tblQualifications.qualification_type,1) != 4
_context.TblEmployees
                .Count(e => e.DesignationCode == 3 && e.EmployeeQualifications.All(q => q.QualificationType != 4));
在实体框架中,您可以这样做

SELECT COUNT(*)
  FROM [DbBzuCC].[dbo].[tblEmployees]
  Left join tblQualifications ON tblEmployees.Employee_Code = tblQualifications.Employee_Code
  WHERE tblEmployees.Designation_Code = 3 AND ISNULL(tblQualifications.qualification_type,1) != 4
_context.TblEmployees
                .Count(e => e.DesignationCode == 3 && e.EmployeeQualifications.All(q => q.QualificationType != 4));
谢谢大家宝贵的时间


关于,

所以你有
员工和
资格
,一对多的关系:每个
员工
都有零个或多个
资格
,每个
资格
都是恰好一名
员工的
资格
,即外键EmployeeCode所指的员工

如果您已经遵循,您将拥有类似于以下内容的类:

class Employee
{
    public int Id {get; set;}
    public string Name {get; set;}
    ...

    // Every Employee has zero or more Qualifications (one-to-many)
    public virtual ICollection<Qualification> {get; set;}
}

class Qualification
{
     public int Id {get; set;}
     public string Description {get; set;}
     ...

     // Every qualification is the qualification of exactly one Employee using foreign key
     public int EmployeeId {get; set;}
     public virtual Employee Employee {get; set;}
}
换句话说:每个员工在property EmployeeCode中都有一个主键。每个员工在财产方面都没有或有更多的资格。员工资格。每个资格在property Qualification.Employee中只有一名员工,使用外键QualificationIn.EmployeeCode

回到你的问题上来 要求:计算具有资格类型的资格数量!=4对于名称代码=3的员工

使用虚拟ICollection,这很简单:

int qualificationTypeToIgnore == 4;
int employeeDesignationCode == 3;

var result = dbContext.Qualifications.Where(qualification =>
        qualification.QualificationType != qualificationTypeToIgnore &&
        qualification.Employee.DesignationCode == employeeDesignationCode)
    .Count();
换句话说:从所有资格中,仅保留那些资格类型不等于资格类型的资格,这些资格也属于设计代码等于EmployeeDesignCode的员工。计算剩余资格证书的数量

实体框架知道一对多关系,并将为您执行属性连接

有些人不喜欢使用虚拟属性,他们更喜欢自己加入

var eligibleEmployees = dbContext.Employees
    .Where(employee => Employee.DesignationCode == employeeDesignationCode);
var eligibleQualifications = dbContext.Qualifications
    .Where(qualification => qualification.QualificationType != qualificationTypeToIgnore);

var result = eligibleQualifications.Join(eligibleEmployees,

qualification => qualification.EmployeeCode, // from every Qualification take the foreign key
employee => employee.EmployeeCode,           // from every Employee take the primary key

// parameter resultSelector: from every (qualification, employee) combination make one new
(qualification, employee) => new {qualification, employee})

.Count();
由于您将不使用联接结果,因此可以简化参数resultSelector:

(qualification, employee) => 1
或者让实体框架进行连接:

var result = eligibleQualifications.Where(qualification => eligibleEmployees
    .Any(employee => employee.EmployeeCode == qualification.EmployeeCode))
.Count();
从所有符合条件的资格中,计算具有EmployeeCode的资格的数量,该EmployeeCode也是符合条件的员工中的EmployeeCode


使用虚拟属性的解决方案是最优雅的解决方案。请看这篇文章。@Kwikslver您认为我的代码需要枚举吗?我使用的是数据库优先的方法,我想执行一个简单的查询,以获得资格表中所有具有博士学位的员工,以及资格表中不具有博士学位的员工,如果他们不存在任何博士记录。最终,您的解决方案非常好,感谢您的帮助,但我们需要在加入条件下使用所有方法,而不是任何方法,因为有些员工需要加入没有资格证书记录,所以他们不见了。我想统计一下非4类教育的非博士生。我希望现在问题清楚了。谢谢你的帮助,但我自己已经回答了这个问题。我真的很感谢你的帮助,但是你在一个地方误解了,所有的员工都没有相关的资质。所以虚拟财产法在这里不起作用,因为所有的员工都不在资格表中,我们无法根据资格条件匹配他们