使用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?
答案 0 :(得分:0)
条件表达式在LINQ查询中并不难使用;只需使用? :
条件运算符。您甚至可以使用let
关键字引入临时变量。
但我认为你的剩余余额累加器(tempgivenAmount
)将是一个棘手的问题。每次循环迭代,您将该值递减一些计算量,然后该新值成为下一次迭代计算的输入。 LINQ不是为了使用像这样的可变变量而构建的;它专为纯功能操作而设计,没有副作用。 (如果您正在使用LINQ to Objects,那么您可以摆脱一些可变性,但这些构造不会映射到SQL,因此您无法将它们与Entity Framework一起使用。)
鉴于您的计算方式有效,我认为您需要在代码中进行循环。