Tim*_*mwi 25 .net c# sql entity-framework
在SQL中,有时可能会写一些类似的东西
DELETE FROM table WHERE column IS NULL
Run Code Online (Sandbox Code Playgroud)
要么
UPDATE table SET column1=value WHERE column2 IS NULL
Run Code Online (Sandbox Code Playgroud)
或可能适用于多行的任何其他标准.
据我所知,最好的EntityFramework可以做的就像
foreach (var entity in db.Table.Where(row => row.Column == null))
db.Table.Remove(entity); // or entity.Column2 = value;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
但是当然会检索所有实体,然后为每个实体运行单独的DELETE查询.当然,如果有许多实体满足标准,那肯定要慢得多.
因此,简而言之,EntityFramework是否支持在单个查询中更新或删除多个实体?
Lad*_*nka 13
EF不支持批量更新或删除,但您可以执行以下操作:
db.Database.ExecuteSqlCommand("DELETE FROM ...", someParameter);
Run Code Online (Sandbox Code Playgroud)
编辑:
真正想要坚持LINQ查询的人有时会使用解决方法,他们首先从LINQ查询创建选择SQL查询:
string query = db.Table.Where(row => row.Column == null).ToString();
Run Code Online (Sandbox Code Playgroud)
然后找到第一次出现FROM
并用查询替换查询的开头DELETE
并执行结果ExecuteSqlCommand
.这种方法的问题在于它仅适用于基本场景.它不适用于实体拆分或某些继承映射,您需要为每个实体删除两个或多个记录.
查看Entity Framework Extensions(多个实体更新).该项目允许使用lambda表达式进行集合操作.来自doc的样本:
this.Container.Devices.Delete(o => o.Id == 1);
this.Container.Devices.Update(
o => new Device() {
LastOrderRequest = DateTime.Now,
Description = o.Description + "teste"
},
o => o.Id == 1);
Run Code Online (Sandbox Code Playgroud)
挖掘EFE项目源代码,你可以看到自动化@Ladislav Mrnka第二种方法也增加了设置操作:
public override string GetDmlCommand()
{
//Recover Table Name
StringBuilder updateCommand = new StringBuilder();
updateCommand.Append("UPDATE ");
updateCommand.Append(MetadataAccessor.GetTableNameByEdmType(
typeof(T).Name));
updateCommand.Append(" ");
updateCommand.Append(setParser.ParseExpression());
updateCommand.Append(whereParser.ParseExpression());
return updateCommand.ToString();
}
Run Code Online (Sandbox Code Playgroud)
编辑3年后
看看这个伟大的答案:https://stackoverflow.com/a/12751429
归档时间: |
|
查看次数: |
9684 次 |
最近记录: |