修复了为匿名类型分配值

时间:2019-03-07 09:36:33

标签: linq asp.net-mvc-4 anonymous-types

在下面的查询中,我创建了具有匿名类型的新变量。

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循环中那样分配值?

2 个答案:

答案 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;