C# 实体框架核心Read&;更新多行-复合主键
我有这样一个表结构:C# 实体框架核心Read&;更新多行-复合主键,c#,entity-framework,entity-framework-core,dbcontext,composite-key,C#,Entity Framework,Entity Framework Core,Dbcontext,Composite Key,我有这样一个表结构: ID Code Value 1 2 text1 2 3 text3 2 4 text4 public class Branch { public int ID {get; set;} public int Code {get; set;} } .Where(e => (e.ID == listOfBranch[0].ID && e.Code == listOfBranch[0].Code) ||
ID Code Value
1 2 text1
2 3 text3
2 4 text4
public class Branch
{
public int ID {get; set;}
public int Code {get; set;}
}
.Where(e =>
(e.ID == listOfBranch[0].ID && e.Code == listOfBranch[0].Code)
||
(e.ID == listOfBranch[1].ID && e.Code == listOfBranch[1].Code)
// ...
||
(e.ID == listOfBranch[N-1].ID && e.Code == listOfBranch[N-1].Code)
)
在这里,ID和Code构成复合主键,即在上表中,不能有ID=2和Code=4的另一行
现在我们使用的是entity framework core,我有一个名为Branch(表示复合键)的类,它如下所示:
ID Code Value
1 2 text1
2 3 text3
2 4 text4
public class Branch
{
public int ID {get; set;}
public int Code {get; set;}
}
.Where(e =>
(e.ID == listOfBranch[0].ID && e.Code == listOfBranch[0].Code)
||
(e.ID == listOfBranch[1].ID && e.Code == listOfBranch[1].Code)
// ...
||
(e.ID == listOfBranch[N-1].ID && e.Code == listOfBranch[N-1].Code)
)
其次,我还有一个列表。现在我想做两件事:
首先进行一次数据库调用,获取整个分支列表的完整对象(ID、代码、值)
之后,我将更改每个对象的“值”
然后我想进行一次数据库调用,并为每行保存更新的“值”
目前我在循环中这样做,所以效率很低
foreach(var x in listOfBranch)
{
var record = context.Table.Find(x.ID, x.Code);
record.Value = "new value";
context.SaveChanges();
}
我们如何在一次通话中做到这一点?谢谢
现在我想做两件事:
首先进行一次数据库调用,获取整个分支列表的完整对象(ID、代码、值)
之后,我将更改每个对象的“值”
然后我想进行一次数据库调用,并为每行保存更新的“值”
第二部分很简单-只需将SaveChanges()
调用移出循环即可
第一部分很棘手。在编写本文时(EF Core 2.0.2),Contains
只能与单个属性一起使用,并连接到内存集合、基于Concat
的查询或过滤器等
.Where(e => listOfBranch.Any(b => b.ID == e.ID && b.Code == e.Code))
所有这些都不会转换为SQL,而是在本地进行计算
使用单个数据库查询获得所需结果的唯一方法是动态构建如下筛选条件:
ID Code Value
1 2 text1
2 3 text3
2 4 text4
public class Branch
{
public int ID {get; set;}
public int Code {get; set;}
}
.Where(e =>
(e.ID == listOfBranch[0].ID && e.Code == listOfBranch[0].Code)
||
(e.ID == listOfBranch[1].ID && e.Code == listOfBranch[1].Code)
// ...
||
(e.ID == listOfBranch[N-1].ID && e.Code == listOfBranch[N-1].Code)
)
您可以使用Expression
类方法构建上述谓词,如下所示(只需将Record
替换为实体类型):