无法将类型为“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();
}