0

我正在使用 Entity Framework Z Plus 批量更新方法。由于以下问题,我无法继续。实际上,当我给出静态值时,Update 方法效果很好tagName="amir1"。但是我需要Tagdescription从 Web 服务或基于的另一个集合中获取tagId,更新方法不接受扩展方法或任何其他方法来完成我的要求。它的说法

“LINQ to Entities 无法识别方法 'System.String GetTagDescription(Int32)' 方法,并且此方法无法转换为存储表达式。”。

希望我的要求现在很清楚。如果有任何其他方法可以满足我的要求,请指导我。

这是我的代码:

using (var context = new TrialsDBEntities())
{
     context.tblTags.Where(x => (tagIdCollection.Contains(x.tagId))).
                Update(m => new tblTag { tagDescription = m.tagId.GetTagDescription(), tagName = "amir1" });
}

public static string GetTagDescription(this int i)
{
     return "test" + i;

     ///Replace above line with call to database or web service call 
     getting some text by giving i as input
}
4

2 回答 2

1

免责声明:我是Entity Framework Plus项目的所有者

不幸的是,无法将 BatchUpdate 与从一行更改为另一行的值一起使用。

免责声明:我是实体框架扩展项目的所有者

在这种情况下,我们通常建议使用我们为这种情况构建的付费库,并提供高性能的保存操作。

例子

// Easiest way
context.BulkSaveChanges();

// Fastest way
context.BulkUpdate(tags);

编辑:回答评论

如果我不能使用更新的行,那么为什么动作的签名会产生误导,让我有可能这样写:e => new Entity { Name = e.Name + "Edited" }

对于大多数提供程序(例如 SQL Server),您的表达式是受支持的。您给出一个全局表达式,以便我们可以应用。您的表情不会从一行更改为另一行,而是相同的表情。

不支持的是从一行到另一行给出特定的表达式。

于 2018-09-18T11:54:41.187 回答
-2

编写代码如下:

using (var context = new TrialsDBEntities())
{
   var tagsToBeUpdated =  context.tblTags.Where(x => (tagIdCollection.Contains(x.tagId))).AsNoTracking().ToList();

   //Only use this code block if your tagsToBeUpdated list is too large
   Parallel.ForEach(tagsToBeUpdated, tagToBeUpdated =>
   {
      var tagDescription = GetTagDescription(tagToBeUpdated.tagId);
      tagToBeUpdated.tagDescription = tagDescription;
      context.Entry(tagToBeUpdated).State = EntityState.Modified;
   });

   //Only use this code block if your tagsToBeUpdated list is not too large
   foreach(var tagToBeUpdated in tagsToBeUpdated)
   {
      var tagDescription = GetTagDescription(tagToBeUpdated.tagId);
      tagToBeUpdated.tagDescription = tagDescription;
      context.Entry(tagToBeUpdated).State = EntityState.Modified;
   }

   context.SaveChanges();         
}

public static string GetTagDescription(int i)
{
     return "test" + i;

     ///Replace above line with call to database or web service call 
     //getting some text by giving i as input
}
于 2018-09-18T04:13:06.040 回答