1

以下のクエリがある場合:-

var Values = from data in DtSet.Tables["tblCosts"].AsEnumerable()
            group data by new
            {
                InvNo = data.Field<double>("InvoiceNo"),
                AccRef = data.Field<double>("SiteRefNum"),
            }
            into g
            select new
            {
                Code = "1",
                InvType = "I",
                Account = g.Key.AccRef,
                InvNo = g.Key.InvNo,
                ChargeTotal = g.Sum(d => d.field<double>("Charge")
            };

...列ChargeTotalの合計がゼロである行を除外する最良の方法は何ですか?を使用する必要WHEREがあると思いますが、どこに配置すればよいかわかりません。

4

1 に答える 1

5

(グループによって異なります)のwhere後に呼び出す必要があるため、多くの解決策はありません。group by

var Values = from data in DtSet.Tables["tblCosts"].AsEnumerable()
             group data by new
             {
                 InvNo = data.Field<double>("InvoiceNo"),
                 AccRef = data.Field<double>("SiteRefNum"),
             }
             into g
             let sum = g.Sum(d => d.field<double>("Charge"))  // Sum only computed once
             where sum != 0
             select new
             {
                 Code = "1",
                 InvType = "I",
                 Account = g.Key.AccRef,
                 InvNo = g.Key.InvNo,
                 ChargeTotal = sum
             };

パフォーマンスをわずかに改善するには(データに大きく依存するため、パフォーマンスが改善されるかどうかを確認するために両方をテストする必要があります)、d.field( "Charge")が常に> = 0の場合、次のように実行できます。

var Values = from data in DtSet.Tables["tblCosts"].AsEnumerable()
             group data by new
             {
                 InvNo = data.Field<double>("InvoiceNo"),
                 AccRef = data.Field<double>("SiteRefNum"),
             }
             into g
             where g.Any(d => d.field<double>("Charge") != 0)  
             select new
             {
                 Code = "1",
                 InvType = "I",
                 Account = g.Key.AccRef,
                 InvNo = g.Key.InvNo,
                 ChargeTotal = g.Sum(d => d.field<double>("Charge"))
             };
于 2013-01-29T14:45:49.657 に答える