无法将类型为“System.Collections.Generic.List[Interfaces.IUser] 的对象转换为类型为“System.Linq.IQueryable[Interfaces.IUser]
Unable to cast object of type 'System.Collections.Generic.List[Interfaces.IUser] to type 'System.Linq.IQueryable[Interfaces.IUser]
我不知道我在 API 请求中使用存储库模式有什么问题,这里是代码
在存储库中
public IQueryable<IUser> Get()
{
return _mapper.Map<IQueryable<IUser>>(_context.Users.AsQueryable());
}
在API
// GET: api/UserEntities
public IQueryable<UserEntity> GetUsers()
{
return _mapper.Map<IQueryable<UserEntity>>(_repository.Get());
}
让我们从基础开始。这段代码:
public IQueryable<IUser> Get()
{
return _mapper.Map<IQueryable<IUser>>(_context.Users.AsQueryable());
}
在多个方面是完全错误的:
- 你不应该 return
IQueryable<T>
。这会泄漏 Entity Framework 依赖项。
- 您不应该 运行 映射器针对
IQueryable<T>
,而是针对结果的元素。
- 在
IQueryable<T>
上执行 AsQueryable()
与执行 "string".ToString()
相同 -> 完全没有效果。
- 将
AsQueryable()
更改为 AsEnumerable()
会 return 同步整个 table。
即使这只是出于学习目的,这也是完全不正确的,您只是在学习非常错误的做法。最好从一开始就学习如何正确做事。
由于您正在使用 Entity Framework,并且显然泄漏依赖性不是问题,让我们摆脱整个方法并正确地执行它:
// GET: api/UserEntities
public async Task<IEnumerable<UserEntity>> GetUsersAsync()
{
var users = await _context.Users
.Select(x => _mapper.Map<UserEntity>(x))
.AsNoTracking()
.ToArrayAsync();
return users;
}
Entity Framework 实现了工作单元和存储库模式,因此将它放在另一个存储库后面是浪费时间,只会增加复杂性而没有任何好处,除非在极少数情况下删除 EF 是一个真正的选择。
这是我简单修复它的方法,
在存储库中
public IQueryable<IUser> Get()
{
return _mapper.Map<List<IUser>>(_context.Users).AsQueryable();
}
在API
public IQueryable<UserEntity> GetUsers()
{
return _mapper.Map<List<UserEntity>>(_repository.Get()).AsQueryable();
}
我不知道我在 API 请求中使用存储库模式有什么问题,这里是代码
在存储库中
public IQueryable<IUser> Get()
{
return _mapper.Map<IQueryable<IUser>>(_context.Users.AsQueryable());
}
在API
// GET: api/UserEntities
public IQueryable<UserEntity> GetUsers()
{
return _mapper.Map<IQueryable<UserEntity>>(_repository.Get());
}
让我们从基础开始。这段代码:
public IQueryable<IUser> Get()
{
return _mapper.Map<IQueryable<IUser>>(_context.Users.AsQueryable());
}
在多个方面是完全错误的:
- 你不应该 return
IQueryable<T>
。这会泄漏 Entity Framework 依赖项。 - 您不应该 运行 映射器针对
IQueryable<T>
,而是针对结果的元素。 - 在
IQueryable<T>
上执行AsQueryable()
与执行"string".ToString()
相同 -> 完全没有效果。 - 将
AsQueryable()
更改为AsEnumerable()
会 return 同步整个 table。
即使这只是出于学习目的,这也是完全不正确的,您只是在学习非常错误的做法。最好从一开始就学习如何正确做事。
由于您正在使用 Entity Framework,并且显然泄漏依赖性不是问题,让我们摆脱整个方法并正确地执行它:
// GET: api/UserEntities
public async Task<IEnumerable<UserEntity>> GetUsersAsync()
{
var users = await _context.Users
.Select(x => _mapper.Map<UserEntity>(x))
.AsNoTracking()
.ToArrayAsync();
return users;
}
Entity Framework 实现了工作单元和存储库模式,因此将它放在另一个存储库后面是浪费时间,只会增加复杂性而没有任何好处,除非在极少数情况下删除 EF 是一个真正的选择。
这是我简单修复它的方法, 在存储库中
public IQueryable<IUser> Get()
{
return _mapper.Map<List<IUser>>(_context.Users).AsQueryable();
}
在API
public IQueryable<UserEntity> GetUsers()
{
return _mapper.Map<List<UserEntity>>(_repository.Get()).AsQueryable();
}