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 回答