【问题标题】:Exclude columns where all rows in that column are null or equal to 0 in LINQ在 LINQ 中排除该列中所有行为空或等于 0 的列
【发布时间】:2016-02-26 02:04:49
【问题描述】:

我需要从 DataSet 查询中排除一列,其中该列仅包含 0(空值)。

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

查询需要是通用的,才能在多个不同的数据表中使用,因此我无法明确声明要排除的列名。

我试过的最新代码是:

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 解决方案会更简洁)

【问题讨论】:

    标签: c# sql .net linq


    【解决方案1】:

    这可以通过三个查询完成 - 一个针对您的 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()
    );
    

    【讨论】:

    • 您的最后一行代码:'r.ItemArray[i]' 产生错误 -> “无法将类型 'bool' 隐式转换为 'int” ...您是否尝试这样做:r .ItemArray[columnsToKeep.IndexOf(i)] ?
    • @MikeDub 啊,那是因为我在第二个查询中使用了Select 而不是Where
    • 使用第二个查询时: var columnsToKeep = Enumerable.Range(0, theTable.Columns.Count) .Select(i => allRows.All(r => r.ItemArray[i] != null && long.Parse(r.ItemArray[i].ToString()) != 0)) .ToList();它没有正确返回要保留的列。
    • 如果我将 Q2 更改为: var columnsToExclude = Enumerable.Range(0, theTable.Columns.Count) .Select(i => allRows.All(r => r.ItemArray[i] != null && long.Parse(r.ItemArray[i].ToString()) == 0)) .ToList(); ...它似乎工作正常。你能解释一下如何修复 Query 3 吗?
    • 是的,但它只有在我将其更改为 columnsToExclude 时才有效,只是想找出最好的方法让它在查询 3 中排除这些列
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多