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”的调用来显式切换到客户端评估。
由于用于访问属性的反射,此行无法转换为 sql 调用:
dataAsQueryable = dataAsQueryable.Where(entity => (long)tenantIdProperty.GetValue(entity) == (long)tenantId);
如果需要反射(不太可能),那么您必须在查询之外进行过滤:
dataAsQueryable = dataAsQueryable.ToArray().Where(entity => (long)tenantIdProperty.GetValue(entity) == (long)tenantId);