如何在select语句中计算

时间:2013-06-17 10:43:39

标签: c# linq entity-framework linq-to-entities

使用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?

1 个答案:

答案 0 :(得分:0)

条件表达式在LINQ查询中并不难使用;只需使用? :条件运算符。您甚至可以使用let关键字引入临时变量。

但我认为你的剩余余额累加器(tempgivenAmount)将是一个棘手的问题。每次循环迭代,您将该值递减一些计算量,然后该新值成为下一次迭代计算的输入。 LINQ不是为了使用像这样的可变变量而构建的;它专为纯功能操作而设计,没有副作用。 (如果您正在使用LINQ to Objects,那么您可以摆脱一些可变性,但这些构造不会映射到SQL,因此您无法将它们与Entity Framework一起使用。)

鉴于您的计算方式有效,我认为您需要在代码中进行循环。