当我从存储库检索 GetAllAsQueryable 并添加 where 子句时,出现错误。要么重写查询

问题描述 投票:0回答:1
public async Task<IEnumerable<T>> GetAllAsync() {
    var dataAsQueryable = repository.GetAllAsQueryable();
    if (typeof(TenantEntity).IsAssignableFrom(typeof(T))) {
        var tenantId = currentUserService.GetCurrentTenantId();

        if (tenantId is null or 0) {
            return await dataAsQueryable.ToListAsync();
        }

        var tenantIdProperty = typeof(T).GetProperty("TenantId", BindingFlags.Public | BindingFlags.Instance);
        if (tenantIdProperty != null) {
            dataAsQueryable = dataAsQueryable.Where(entity => (long)tenantIdProperty.GetValue(entity) == (long)tenantId);
        }
    }
    return dataAsQueryable;
}

 public IQueryable<TEntity> GetAllAsQueryable() { return _dbSet.AsQueryable(); }

数据库中TenantId不能为null且类型为long。 当尝试获取此查询时,会抛出如下异常: 以可翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端评估。

c# .net linq repository asqueryable
1个回答
0
投票

由于用于访问属性的反射,此行无法转换为 sql 调用:

dataAsQueryable = dataAsQueryable.Where(entity => (long)tenantIdProperty.GetValue(entity) == (long)tenantId);

如果需要反射(不太可能),那么您必须在查询之外进行过滤:

dataAsQueryable = dataAsQueryable.ToArray().Where(entity => (long)tenantIdProperty.GetValue(entity) == (long)tenantId);
© www.soinside.com 2019 - 2024. All rights reserved.