Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心Read&;更新多行-复合主键_C#_Entity Framework_Entity Framework Core_Dbcontext_Composite Key - Fatal编程技术网

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
替换为实体类型):