通过在唯一ID </property>上连接另一个List <property>来水合属性

时间:2013-07-15 18:51:35

标签: c# linq

我有两个列表,一个是Equipment列表,另一个是WorkflowItems列表EquipmentEquipment列表中的List<WorkflowItem>属性只有其中一个值为水合ProcessIdList<Equipment>有两个属性,ProcessIdName。我想使用List<WorkflowItem>.Equipment.Name

中单个Equipment记录的值来保留List<Equipment> 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 };

下面的LINQ查询将选择一个基本的项目,基本上做我正在寻找的东西,但我宁愿填写原始列表。

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

...最终修改

但这确实有效:

{{1}}

2 个答案:

答案 0 :(得分:0)

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

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,在这种情况下,我可以给你一个很好的建议:“已经有一些东西可以满足你的需求。”

答案 1 :(得分:0)

由于数据集不是很大(少于20条记录),因此我能够在不影响性能的情况下实现此目标

workflowItems.ForEach(x => x.Equipment = barcodeEquipmentList
                           .Where(e => e.Process.Id == x.Equipment.Process.Id)
                           .FirstOrDefault());