修复为匿名类型分配值

问题描述 投票:1回答:2

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

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

linq asp.net-mvc-4 anonymous-types
2个回答
1
投票

在我看来,您的查询是这样的:

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;
}

1
投票

唯一的出路可能是创建一个具有所需属性的class SampleDetail,然后更改LINQ以使用select new SampleDetail { SDASampleId = ... etc }

然后,您可以根据需要随时更改每个SampleDetail对象的值。

© www.soinside.com 2019 - 2024. All rights reserved.