Entity Framework Z Plus 批量更新
Entity Framework Z Plus Batch Update
我正在使用 Entity Framework Z Plus 批量更新方法。由于以下问题,我无法继续。实际上,当我给出像 tagName="amir1"
这样的静态值时,Update 方法效果很好。但我需要从 Web 服务或基于 tagId
的另一个集合获取 Tagdescription
,更新方法不接受扩展方法或任何其他方法来完成我的 requirement.Its 说法
"LINQ to Entities does not recognize the method 'System.String GetTagDescription(Int32)' method, and this method cannot be translated into a store expression.".
希望我的要求现在清楚了。如果有任何其他方法可以满足我的要求,请指导我。
这是我的代码:
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
}
按如下方式编写代码:
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
}
免责声明:我是项目的所有者Entity Framework Plus
遗憾的是,无法将 BatchUpdate 与从一行更改为另一行的值一起使用。
免责声明:我是项目的所有者Entity Framework Extensions
在这种情况下,我们通常建议使用我们为这种情况构建的付费库,并提供高性能的保存操作。
例子
// Easiest way
context.BulkSaveChanges();
// Fastest way
context.BulkUpdate(tags);
编辑:回答评论
If I can't use updated row so why the signature of action is misleading and give me possibility to write like this: e => new Entity { Name = e.Name + "Edited" }
对于大多数供应商,例如 SQL Server,您的表达是受支持的。你给出一个全局表达式,这样我们就可以申请了。你的表情不会从一行到另一行发生变化,它是相同的表达式。
不支持从一行到另一行给出特定表达式。
我正在使用 Entity Framework Z Plus 批量更新方法。由于以下问题,我无法继续。实际上,当我给出像 tagName="amir1"
这样的静态值时,Update 方法效果很好。但我需要从 Web 服务或基于 tagId
的另一个集合获取 Tagdescription
,更新方法不接受扩展方法或任何其他方法来完成我的 requirement.Its 说法
"LINQ to Entities does not recognize the method 'System.String GetTagDescription(Int32)' method, and this method cannot be translated into a store expression.".
希望我的要求现在清楚了。如果有任何其他方法可以满足我的要求,请指导我。
这是我的代码:
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
}
按如下方式编写代码:
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
}
免责声明:我是项目的所有者Entity Framework Plus
遗憾的是,无法将 BatchUpdate 与从一行更改为另一行的值一起使用。
免责声明:我是项目的所有者Entity Framework Extensions
在这种情况下,我们通常建议使用我们为这种情况构建的付费库,并提供高性能的保存操作。
例子
// Easiest way
context.BulkSaveChanges();
// Fastest way
context.BulkUpdate(tags);
编辑:回答评论
If I can't use updated row so why the signature of action is misleading and give me possibility to write like this: e => new Entity { Name = e.Name + "Edited" }
对于大多数供应商,例如 SQL Server,您的表达是受支持的。你给出一个全局表达式,这样我们就可以申请了。你的表情不会从一行到另一行发生变化,它是相同的表达式。
不支持从一行到另一行给出特定表达式。