2016-05-12 15 views
1

次のLINQクエリwhere節が期待される結果を返さない。 dtTemp row.Item(0)"GE", "LE", "ST", "PL"のような値を持ち、Stkyardはこれらの値の1つ以上を持つ文字列配列です。where句の文字列配列を使用したLinqクエリ

私は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つの行があり、1つは各タイプから、もう1つはStkyardの項目の1つを含むので、グループ全体が一致します。この問題を解決するには

、あなたのグループの前に行をフィルタ:

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を使用することができます。あなたがグループの後でそれを使うならば、あなたはグループをフィルタリングしています(もっとHAVINGのSQLのようなものです)。 – Richard

関連する問題