0

C# linq エンティティ フレームワーク 4 に取り組みます。

次の構文から foreach ループを回避したいです。select ステートメントで foreach ループの計算を計算できますか?

var result = (from p in MasterDetail
              join q in Master on p.TaxID equals q.TaxID
              where p.EffectiveDate >= tempEffectiveDate && p.EffectiveDate <= tempEffectiveDate
              select new TransactionItem
              {
                  MasterDetailID = p.MasterDetailID,
                  CustomCode = p.CustomCode,
                  TaxID = p.TaxID,
                  TaxName = q.TaxName,
                  ItemID = p.ItemID,
                  EffectiveDate = p.EffectiveDate,
                  SlavAmount = (decimal)0.0,
                  SlavTaxAmount = (decimal)0,
                  Rate = p.Rate,
                  BarCode = p.BarCode,
                  IsPercentage = p.IsPercentage,
                  CurrencyID = p.CurrencyID,
                  MinAmount = p.MinAmount,
                  MaxAmount = p.MaxAmount,
              }).AsEnumerable();


decimal tempgivenAmount = givenAmount;
decimal temp = 0;
List<TransactionItem> oList = new List<MasterDetailList>();


foreach (MasterDetailList item in result)
{
    temp = tempgivenAmount - item.MaxAmount;

    if (temp >= 0)
    {
        temp = item.MaxAmount;
    }
    else
    {
        temp = tempgivenAmount;
    }

    if (item.IsPercentage == true)
    {
        item.SlavTaxAmount = (decimal)Math.Abs(temp) * (item.Rate / 100);
    }
    else
    {
        item.SlavTaxAmount = item.Rate;
    }

    item.SlavAmount = Math.Abs(temp);
    tempgivenAmount = tempgivenAmount - item.MaxAmount;
    oList.Add(item);

    if (tempgivenAmount <= 0)
    {
        break;
    }
}

LINQ を使用して上記の foreach を作成するにはどうすればよいですか?

4

1 に答える 1

0

LINQ クエリ内で条件式を使用するのは難しくありません。? :条件演算子を使用するだけです。letまた、キーワードを使用して一時変数を導入することもできます。

tempgivenAmountしかし、残高アキュムレータ ( ) が問題になると思います。ループの反復ごとに、計算された量だけその値を減らし、その新しい値が次の反復の計算への入力になります。LINQ は、そのような変更可能な変数を使用するように構築されていません。副作用のない純粋な機能操作用に設計されています。(LINQ to Objects を使用している場合は、ある程度の可変性を回避できますが、これらの構造は SQL にマップされないため、Entity Framework では使用できませんでした。)

計算の仕組みを考えると、ループをコードで実行する必要があると思います。

于 2013-06-17T12:04:53.670 に答える