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我计划以后删除这两条评论。