我该如何计算林克左接右侧没有对手的记录数

本文关键字:对手 记录 何计算 林克 计算 | 更新日期: 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")
    };