簡體   English   中英

在LINQ中排除該列中所有行均為null或等於0的列

[英]Exclude columns where all rows in that column are null or equal to 0 in LINQ

我需要從DataSet查詢中排除一列,其中該列僅包含0(空)。

我發現的所有解決方案(例如: 在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中使用該解決方案會更干凈)

這可以通過三個查詢來完成-一個針對您的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()
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM