通过加入另一List<;属性>;在唯一Id上
本文关键字:gt 属性 唯一 Id lt List | 更新日期: 2023-09-27 18:22:21
我有两个列表,一个是Equipment
的列表,另一个是具有Equipment
属性的WorkflowItems
的列表。List<WorkflowItem>
列表中的Equipment
属性只有一个水合值ProcessId
。List<Equipment>
具有两种水合性质,即ProcessId
和Name
。我想用List<Equipment>
中单个Equipment
记录的值对List<WorkflowItem>.Equipment.Name
进行水合
下面的这个LINQ查询将选择一个通用项目,基本上完成我想要的任务,但我宁愿只填写原始列表。
var list = from item in workflowItems
join equipment in barcodeEquipmentList on
item.Equipment.ProcessId equals equipment.ProcessId
select new
{
ProcessId = item.Equipment.ProcessId,
EquipmentName = equipment.Name
};
编辑这个列表将相对较小,即使做这样的事情也可以(除了这个不起作用之外)
workflowItems.ForEach(x => x.Equipment = from e in barcodeEquipmentList
where e.Process.Id == x.Equipment.Process.Id
select e
);
。。。最终编辑
但这确实有效:
workflowItems.ForEach(x => x.Equipment = barcodeEquipmentList
.Where(e => e.Process.Id == x.Equipment.Process.Id)
.FirstOrDefault());
这段代码应该符合您的需求:
public class Equipment {
public int ProcessId { get; set; }
public string Name { get; set; }
}
public class WorkflowItem {
public Equipment { get; set; }
public void LoadEquipmentFrom(IEnumerable<Equipment> cache){
var equipment = cache.FirstOrDefault(e => e.ProcessId == Equipment.ProcessId);
if(equipment != null)
Equipment.Name = equipment.Name;
}
}
您也可以将缓存中的实例分配给现有实例,这并不重要,因为两者必须具有相同的标识符Equipment = equipment;
。如果您有更多的属性要设置,这会更容易。要进一步优化,请使用IDictionary<int, Equipment>
而不是IEnumerable<Equipment>
,因为您将经常阅读该集合。
我猜你正在实现一种ORM,在这种情况下,我可以给你一个很好的建议:"已经有一些东西可以满足你的需求了。".
由于数据集不是很大(少于20条记录),我能够在不影响性能的情况下完成以下操作
workflowItems.ForEach(x => x.Equipment = barcodeEquipmentList
.Where(e => e.Process.Id == x.Equipment.Process.Id)
.FirstOrDefault());