我该如何计算林克左接右侧没有对手的记录数
本文关键字:对手 记录 何计算 林克 计算 | 更新日期: 2023-09-27 18:30:11
我正在尝试分析一份电话账单,其中包括大量手机号码和相关数据。每个号码要么属于公司中的某个人,要么未分配。
我正在使用此查询将手机号码与员工记录相匹配
var billInfo = from row in csvTable.AsEnumerable()
join d in employeeList
on row.Field<string>("Phone number") equals d.Mobile into t
from rt in t.DefaultIfEmpty()
select new
{
empNo = rt == null ? null : rt.EmpNo,
totalRows = csvTable.Rows.Count,
unassignedNumbers = t.Where(x => x.EmpNo == null).Count(),
name = row.Field<string>("User name"),
mobile = row.Field<string>("Phone number")
};
我想在未分配的数字字段中重新获得未分配的号码。(即,如果csvTable数据表中有100行(每个电话号码一行),并且employeeList中有70行匹配的员工记录,我想返回30作为值-没有匹配员工的行数)。
以下行:
unassignedNumbers = t.Where(x => x.EmpNo == null).Count,
是问题所在。它总是计算为零,而不是员工编号为"空"的行数(empNo)。
使用Count()
,而不是Count
。后者是ICollection<T>
属性,而您正在处理IEnumerable<T>
。
至于查询的逻辑,您在t
上运行t.Where()
,这是一个内部联接。尝试
var billInfo = (from row in csvTable.AsEnumerable()
join d in employeeList
on row.Field<string>("Phone number") equals d.Mobile into t
from rt in t.DefaultIfEmpty()
where rt == null
select row.Field<string>("Phone number")).Count();
您的查询为csvTable
中的每个项目提供至少一个项目。unassignedNumbers
所需的数据将是整个数据集的一个值。因此,您必须执行一个完全独立的查询,然后根据需要将该值直接分配到查询结果中。
int allUnassignedNumbers =
(from row in csvTable.AsEnumerable()
join d in employeeList
on row.Field<string>("Phone number") equals d.Mobile into t
from rt in t.DefaultIfEmpty()
where rt == null
select 1).Count();
var billInfo =
from row in csvTable.AsEnumerable()
join d in employeeList
on row.Field<string>("Phone number") equals d.Mobile into t
from rt in t.DefaultIfEmpty()
select new
{
empNo = rt == null ? null : rt.EmpNo,
totalRows = csvTable.Rows.Count,
unassignedNumbers = allUnassignedNumbers,
name = row.Field<string>("User name"),
mobile = row.Field<string>("Phone number")
};