在 EF Core 中如何 select 特定列并保存
In EF Core how to select specific column and also save
我有以下SQLtable
ID INT
Status NVARCHAR(50)
FileContent XML
我想使用 EF Core select ID
和 Status
列,但不加载 XML 列。 (因为 xml 数据可能很大,我不想将它加载到内存中,而且我正在做的业务逻辑不需要它)
然后设置 Status
public async Task DoSomwthing(int id)
{
// select only needed columns
var result = await _dbContext.MyTable
.Where(x=>x.ID == id)
.Select(x=> new
{
ID = x.ID,
Status = x.Status
})
.SingleOrDefaultAsync();
// do something here using result
// Since i am not loading the complete entity
// How do i set the Status here to new value
//Save the tracked changes
await _dbContext.SaveChangesAsync();
}
除了 Table 拆分将内容视为单独的相关实体外,EF 还支持仅选择列的更新。
因此您可以使用其属性的子集构造一个实体,然后将 non-retrieved 属性标记为未更改。例如:
public async Task DoSomething(int id)
{
// select only needed columns
var result = await this.Foos
.Where(x => x.ID == id)
.Select(x => new Foo
{
ID = x.ID,
Status = x.Status
})
.SingleOrDefaultAsync();
result.Status = 2;
this.Entry(result).State = EntityState.Modified;
this.Entry(result).Property(nameof(Foo.Content)).IsModified = false;
//Save the tracked changes
await this.SaveChangesAsync();
}
- 您应该使用所需的列创建一个新的class
- 使用自动映射器
检查自动映射器文档
这对我有用:
var teacher = _mapper.ProjectTo<TeacherReadDto>(_applicationDb.Teachers.Where(x=>x.Id==id));
我有以下SQLtable
ID INT
Status NVARCHAR(50)
FileContent XML
我想使用 EF Core select ID
和 Status
列,但不加载 XML 列。 (因为 xml 数据可能很大,我不想将它加载到内存中,而且我正在做的业务逻辑不需要它)
然后设置 Status
public async Task DoSomwthing(int id)
{
// select only needed columns
var result = await _dbContext.MyTable
.Where(x=>x.ID == id)
.Select(x=> new
{
ID = x.ID,
Status = x.Status
})
.SingleOrDefaultAsync();
// do something here using result
// Since i am not loading the complete entity
// How do i set the Status here to new value
//Save the tracked changes
await _dbContext.SaveChangesAsync();
}
除了 Table 拆分将内容视为单独的相关实体外,EF 还支持仅选择列的更新。
因此您可以使用其属性的子集构造一个实体,然后将 non-retrieved 属性标记为未更改。例如:
public async Task DoSomething(int id)
{
// select only needed columns
var result = await this.Foos
.Where(x => x.ID == id)
.Select(x => new Foo
{
ID = x.ID,
Status = x.Status
})
.SingleOrDefaultAsync();
result.Status = 2;
this.Entry(result).State = EntityState.Modified;
this.Entry(result).Property(nameof(Foo.Content)).IsModified = false;
//Save the tracked changes
await this.SaveChangesAsync();
}
- 您应该使用所需的列创建一个新的class
- 使用自动映射器
检查自动映射器文档 这对我有用:
var teacher = _mapper.ProjectTo<TeacherReadDto>(_applicationDb.Teachers.Where(x=>x.Id==id));