2016-05-12 65 views
1

我有以下LINQ查詢where子句不返回預期結果。 dtTemp row.Item(0)具有類似於"GE", "LE", "ST", "PL"的值,而Stkyard是具有一個或多個這些值的字符串數組。Linq查詢字符串數組where條款

我期待下面的查詢來Stkyard篩選基於項值,但返回的結果集在dtTemp

dtQuery = (From row In dtTemp 
      Group row By grp = 
      New With {Key .mth = row.Item(1), Key .mthdesc = row.Item(2)} Into Group, 
      val1 = Sum(Convert.ToDecimal(row.Item(3))), val2 = Sum(Convert.ToDecimal(row.Item(4))) 
      Where Group.Any(Function(p) Stkyard.Contains(p.Item(0))) 
      Select New With {grp.mth, grp.mthdesc, val1, val2} 
      Distinct).ToList 

任何幫助所有值的總和?

DonNetFiddle Example

+0

你能分享[.NETFiddle(https://dotnetfiddle.net/)的例子嗎? – aloisdg

+0

@aloisdg我在帖子中添加了一個示例。 – Nilanjan

回答

1

你已經按月份劃分您篩選之前,然後篩選任何地方找到匹配的任何組。例如,您的1月16日組包含3行,每種類型一行,並且您的過濾器與整個組相匹配,因爲它包含Stkyard中的其中一個項目。

爲了解決這個問題,你組之前過濾行:

dtQuery = (From row In dtTemp 
     Where Stkyard.Contains(row.Item(0)) 
     Group row By grp = 
     New With {Key .mth = row.Item(1), Key .mthdesc = row.Item(2)} Into Group, 
     val1 = Sum(Convert.ToDecimal(row.Item(3))), val2 = Sum(Convert.ToDecimal(row.Item(4))) 
     Select New With {grp.mth, grp.mthdesc, val1, val2} 
     Distinct).ToList 

Updated Fiddle

+0

謝謝!我的印象是,Where子句總是出現在Group By子句之後。 – Nilanjan

+0

只要你喜歡,你可以使用盡可能多的wheres。如果在組之後使用它,則會過濾組(更像是SQL中的HAVING)。 – Richard