通过加入另一List<;属性>;在唯一Id上

本文关键字:gt 属性 唯一 Id lt List | 更新日期: 2023-09-27 18:22:21

我有两个列表,一个是Equipment的列表,另一个是具有Equipment属性的WorkflowItems的列表。List<WorkflowItem>列表中的Equipment属性只有一个水合值ProcessIdList<Equipment>具有两种水合性质,即ProcessIdName。我想用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());

通过加入另一List<;属性>;在唯一Id上

这段代码应该符合您的需求:

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());