C# 有没有办法从多个表中检索基于multple where的数据
我已经尝试了一段时间,用各种可能的方式来做到这一点。我有表名员工和其他表名资格 每个员工都有资格,但在最初的基础上,每个员工的资格尚未填入数据库 我也尝试过通过EF和LINQ以及rawC# 有没有办法从多个表中检索基于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
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类教育的非博士生。我希望现在问题清楚了。谢谢你的帮助,但我自己已经回答了这个问题。我真的很感谢你的帮助,但是你在一个地方误解了,所有的员工都没有相关的资质。所以虚拟财产法在这里不起作用,因为所有的员工都不在资格表中,我们无法根据资格条件匹配他们