我需要从DataSet Query中排除一列,其中该列只包含0(Null)。
我找到的所有解决方案(例如: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中使用该解决方案会更清晰)
答案 0 :(得分: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()
);