在下面的查询中,我创建了具有匿名类型的新变量。
var sampleDetailsList = (from detailsA in context.SampleDetailsA
join detailsB in context.SampleDetailsB
on
new
{
Key1 = detailsA.SampleId,
Key2 = detailsA.Main.Year
}
equals
new
{
Key1 = detailsB.SampleId,
Key2 = detailsB.Main.Year
}
where (detailsA.Main.Year == "2018" && detailsB.Main.Year == "2018")
select new
{
SDASampleId = detailsA.SDASampleId,
SDASampleDetailId = detailsA.Id,
SDAAmountA = detailsA.SDAAmountA,
SDAAmountB = detailsA.SDAAmountB,
SDAAmountC = detailsA.SDAAmountC,
SDBSampleId = detailsB.SDBSampleId,
SDBSampleDetailId = detailsB.Id,
SDBAmountA = detailsB.SDBAmountA,
SDBAmountB = detailsB.SDBAmountB,
SDBAmountC = detailsB.SDBAmountC,
}).ToList();
由于匿名类型的属性是只读的。我无法在foreach loop
中分配新值。如果满足条件,我需要将下面的事务列表中的金额添加到sampleDetailsList。
var transactionalList = (from tra in context.Transactions
where (tra.Year == "2018") && (tra.SDASampleDetailId != null || tra.SDBSampleDetailId != null)
select tra).ToList();
if (transactionalList.Count != 0)
{
foreach (var traItem in transactionalList)
{
foreach (var smDetail in sampleDetailsList)
{
if (smDetail.SDASampleId == traItem.SDASampleId)
{
if (traItem.TypeId == "AAA")
{
smDetail.SDAAmountA = smDetail.SDAAmountA + traItem.Amount;
}
else if (traItem.TypeId == "BBB")
{
smDetail.SDAAmountB = smDetail.SDAAmountB + traItem.Amount;
}
else if (traItem.TypeId == "CCC")
{
smDetail.SDAAmountC = smDetail.SDAAmountC + traItem.Amount;
}
}else if (smDetail.SDBSampleId == traItem.SDBSampleId)
{
if (traItem.TypeId == "AAA")
{
smDetail.SDBAmountA = smDetail.SDBAmountA + traItem.Amount;
}
else if (traItem.TypeId == "BBB")
{
smDetail.SDBAmountB = smDetail.SDBAmountB + traItem.Amount;
}
else if (traItem.TypeId == "CCC")
{
smDetail.SDBAmountC = smDetail.SDBAmountC + traItem.Amount;
}
}
}
}
}
如何像foreach循环一样分配值?
在我看来,您的查询是这样的:
var results =
(
from detailsA in context.SampleDetailsA
join detailsB in context.SampleDetailsB
on
new
{
Key1 = detailsA.SampleId,
Key2 = detailsA.Main.Year
}
equals
new
{
Key1 = detailsB.SampleId,
Key2 = detailsB.Main.Year
}
where detailsA.Main.Year == "2018"
where detailsB.Main.Year == "2018"
from tra in context.Transactions
where tra.Year == "2018"
where (tra.SDASampleDetailId != null || tra.SDBSampleDetailId != null)
select new
{
SDASampleId = detailsA.SDASampleId,
SDASampleDetailId = detailsA.Id,
SDAAmountA = detailsA.SDAAmountA + (((detailsA.SDASampleId == tra.SDASampleId) && tra.TypeId == "AAA") ? tra.Amount : 0),
SDAAmountB = detailsA.SDAAmountB + (((detailsA.SDASampleId == tra.SDASampleId) && tra.TypeId == "BBB") ? tra.Amount : 0),
SDAAmountC = detailsA.SDAAmountC + (((detailsA.SDASampleId == tra.SDASampleId) && tra.TypeId == "CCC") ? tra.Amount : 0),
SDBSampleId = detailsB.SDBSampleId,
SDBSampleDetailId = detailsB.Id,
SDBAmountA = detailsB.SDBAmountA + (((detailsB.SDBSampleId == tra.SDBSampleId) && tra.TypeId == "AAA") ? tra.Amount : 0),
SDBAmountB = detailsB.SDBAmountB + (((detailsB.SDBSampleId == tra.SDBSampleId) && tra.TypeId == "BBB") ? tra.Amount : 0),
SDBAmountC = detailsB.SDBAmountC + (((detailsB.SDBSampleId == tra.SDBSampleId) && tra.TypeId == "CCC") ? tra.Amount : 0),
}
)
.ToList();
只是为了帮助别人,这是我必须编写的代码,以使这些代码可编辑:
public static class context
{
public static List<DetailA> SampleDetailsA = new List<DetailA>();
public static List<DetailB> SampleDetailsB = new List<DetailB>();
public static List<Transaction> Transactions = new List<Transaction>();
}
public class Transaction
{
public string Year;
public int? SDASampleDetailId;
public int? SDBSampleDetailId;
public int SDASampleId;
public int SDBSampleId;
public string TypeId;
public int Amount;
}
public class DetailA
{
public int Id;
public int SampleId;
public int SDASampleId;
public int SDAAmountA;
public int SDAAmountB;
public int SDAAmountC;
public Main Main;
}
public class DetailB
{
public int Id;
public int SampleId;
public Main Main;
public int SDBSampleId;
public int SDBAmountA;
public int SDBAmountB;
public int SDBAmountC;
}
public class Main
{
public string Year;
}
唯一的出路可能是创建一个具有所需属性的class SampleDetail
,然后更改LINQ以使用select new SampleDetail { SDASampleId = ... etc }
。
然后,您可以根据需要随时更改每个SampleDetail
对象的值。