如何在选择语句中计算
本文关键字:计算 语句 选择 | 更新日期: 2023-09-27 18:18:46
c# linq实体框架
想要避免foreach循环从我的下面的语法。它是能够计算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 ?
条件表达式在LINQ查询中并不难使用;只要使用? :
条件运算符。您甚至可以使用let
关键字引入临时变量。
但我认为你的余额累加器(tempgivenAmount
)将是一个症结。每次循环迭代,你都将这个值递减一些计算量,然后这个新值成为下一次迭代计算的输入。LINQ不是为使用这样的可变变量而构建的;它是为纯功能操作而设计的,没有副作用。(如果你使用LINQ to Objects,你可以摆脱一些可变性,但这些结构不会映射到SQL,所以你不能在实体框架中使用它们。)
考虑到你的计算方式,我认为你需要在代码中进行循环。