排除该列中的所有行在 LINQ 中均为 null 或等于 0 的列

本文关键字:null 的列 排除 LINQ | 更新日期: 2023-09-27 18:36:28

我需要从数据集查询中排除一列,其中该列仅包含 0(Null)。

我找到的所有解决方案(例如:在 Select 中过滤 Null 值)仅处理每行的条件,不会根据需要考虑列中的所有值。

查询必须是通用的,才能跨多个不同的数据表使用,因此我无法显式声明要排除的列名。

我尝试过的最新代码是:

theTable = result.Tables[0];
var query = theTable.AsEnumerable().Select(r => r.ItemArray.Where(c => long.Parse(c.ToString()) != 0));

这排除了行中的所有 0,但它不保持列结构,我最终得到具有不同长度(列大小)的行。

这是我的示例 SQL 供参考:

SELECT t1.TableIndex
, CASE WHEN t1.EntityName <> t2.EntityName THEN 1 ELSE 0 END AS EntName
, CASE WHEN t1.EntityNumber <> t2.EntityNumber THEN 1 ELSE 0 END AS EntNumber
FROM DbEnv.dbo.tblOne t1 (NOLOCK)
INNER JOIN DbEnv.dbo.tblTwo t2 (nolock) ON t1.TableIndex = t2.TableIndex
WHERE t1.EntityName <> t2.EntityName
OR t1.EntityNumber <> t2.EntityNumber

示例数据集(在这种情况下,应仅排除 Col2):

     Col1 | Col2 | Col3
Row1: 0      0      1
Row2: 1      0      1
Row3: 0      0      0

示例数据集 2(在此方案中,应排除 Col1 和 Col4):

     Col1 | Col2 | Col3 | Col4 | Col5
Row1: 0      0      1      0      1
Row2: 0      0      1      0      1
Row3: 0      1      0      0      1
Row3: 0      1      0      0      1

(解决方案可以是SQL或LINQ,但我认为在LINQ中使用解决方案会更干净)

排除该列中的所有行在 LINQ 中均为 null 或等于 0 的列

这可以通过三个查询来完成 - 一个针对 RDBMS 运行,两个内存中查询:

  • 第一个查询将读取所有列,并将它们放入内存中
  • 第二个查询将确定要保留哪些列
  • 第三个查询将投影出您不需要的列

第一个查询将是针对所有列的"纯"查询:

var allRows = theTable.ToList();

第二个查询可以如下所示:

var columnsToKeep = Enumerable
    .Range(0, columnCount)
    .Where(i => allRows.Any(r => r.ItemArray[i] != null && long.Parse(r.ItemArray[i].ToString()) != 0 ))
    .ToList();

第三个查询如下所示:

var query = allRows.Select(r =>
    columnsToKeep.Select(i => r.ItemArray[i]).ToArray()
);