Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 修复了为匿名类型赋值的问题_Linq_Asp.net Mvc 4_Anonymous Types - Fatal编程技术网

Linq 修复了为匿名类型赋值的问题

Linq 修复了为匿名类型赋值的问题,linq,asp.net-mvc-4,anonymous-types,Linq,Asp.net Mvc 4,Anonymous Types,在下面的查询中,我创建了匿名类型的新变量 var sampleDetailsList = (from detailsA in context.SampleDetailsA join detailsB in context.SampleDetailsB on new { Key1 = deta

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

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循环
中分配新值。如果满足条件,我需要将下面事务列表中的金额添加到SampleDetails列表中

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

唯一的解决方法可能是创建一个带有所需属性的
类SampleDetail
,然后将LINQ更改为使用
选择新SampleDetail{SDASampleId=…etc}


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

在我看来,您的查询如下所示:

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;
}
公共静态类上下文
{
public static List SampleDetailsA=new List();
public static List SampleDetailsB=新列表();
公共静态列表事务=新列表();
}
公共类事务
{
公共字符串年;
公共int?SDASampleDetailId;
公共int?SDBSampleDetailId;
公共样本;
公共int-SDBSampleId;
公共字符串类型ID;
公共整数金额;
}
公开课详情
{
公共int Id;
公共整数样本;
公共样本;
斯达蒙塔公共酒店;
公共国际货币基金组织;
公共国际SDAAmountC;
公共主体;
}
公共类详细信息B
{
公共int Id;
公共整数样本;
公共主体;
公共int-SDBSampleId;
巴马山公共国际酒店;
公共int SDBAMONTB;
公共int SDBAMONTC;
}
公共班机
{
公共字符串年;
}

您似乎重复了
选择新
中的
细节a
,我想您的意思是
detailsB
?是的,应该是detailsB。thanks@PeterB-为什么不呢?它是在你唯一能做的时候——当你创建匿名变量的时候——分配它们。对不起,你是对的,那些非常长的线是隐藏在视图中的,所以看起来你什么都没做,只是稍微澄清了一下问题。包装会有帮助的!Ps我计划以后删除这两条评论。