1

我想使用 EF4 更新实体列表。

  1. 我有一个 ViewModel 对象(从 Web 表单中检索)传递给我的名为“ productToUpdate ”的方法,其中包含一个“标签”列表。
  2. 我使用 Linq 查询从数据库中获取对应的对象列表到一个名为“ requeteValsLabels ”的匿名对象我手动执行此操作(在 foreach 循环中测试 id)如下,但我想这不是最好的方法?

    for (int i = 0; i < productToUpdate.Labels.Count; i++)
            {
                foreach (var item in productToUpdate.Labels)
                {
                    if (requeteValsLabels[i].ID == item.IdValeurLabel){
                    requeteValsLabels[i].Valeur = item.Valeur;
                    }
                }
            }
    
4

3 回答 3

2

您可能想要使用以下模式

        foreach (var item in productToUpdate.Labels) {
            Entity e = new Entity { Id = item.IdValeurLabel};
            context.EntitySet.Attach(e);
            e.Valeur = item.Valeur;
        }

这可以防止加载(选择)到数据库,但是:

  • 由于没有负载发生,您无法确定该 ID 是否存在于数据库中,因此您可能有插入尝试更新不存在的行的异常。
  • 由于没有负载发生,您无法检查标签修改,并且可能会使用相同的值进行更新。
于 2013-04-05T14:10:19.843 回答
1

我认为更有效的方法是加入集合,然后复制值:

var query = from item in productToUpdate.Labels
            join label in requeteValsLabels on item.IdValeurLabel equals label.ID
            select new { item, label };

foreach (var pair in query.ToList())
{
    pair.label.Valuer = pair.item.Valuer;
}
于 2013-04-05T14:08:47.830 回答
0

你的外循环正确吗?应该是

for (int i = 0; i < requeteValsLabels.Count; i++)

您是否正在寻找一种更紧凑的方式来编写此内容?尝试以下操作:

for (int i = 0; i < requeteValsLabels.Count; i++)
{
    requeteValsLabels[i].Valeur = productToUpdate.Labels
        .First(x => x.IdValeurLabel == requeteValsLabels[i].ID).Valeur;
}

不过要小心.. 如果没有满足条件的元素,First() 将抛出异常。

于 2013-04-05T14:20:50.720 回答