在下面的查询中,我创建了具有匿名类型的新变量。
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循环中那样分配值?
答案 0 :(得分:1)
唯一的出路可能是使用所需属性创建一个class SampleDetail
,然后将LINQ更改为使用select new SampleDetail { SDASampleId = ... etc }
。
之后,您可以随时根据需要更改每个SampleDetail
对象的值。
答案 1 :(得分:1)
在我看来,您的查询是这样的:
public class VMJoinRecomendation<DataType> where DataType:class
{
public rec01recommend_cases rec01recommend_cases { get; set; }
public DataType Data { get; set; }
}
为了帮助其他人,这是我必须编写以使该代码可编译的代码:
IList<VMJoinRecomendation<orp02memo_types>> join = qMainCase.Join(qDataList, x => x.rec01ref_id, y => y.orp02uin, (query1, query2) => new VMJoinRecomendation<orp02memo_types>() { rec01recommend_cases = query1, Data = query2 }).ToList();
IList<VMRecommendation<orp02memo_types>> target = new List<VMRecommendation<orp02memo_types>>();
Parallel.ForEach(join, current =>
{
VMRecommendation<orp02memo_types> t = Mapper.Map<VMRecommendation<orp02memo_types>>(current.rec01recommend_cases);
t.Data = current.Data;
target.Add(t);
});
return target;