我的应用程序的业务逻辑层执行自己的授权检查,所有数据查询操作都返回GuardedResult<TResult>
值,这里的定义如下:
public class GuardedResult<TResult> {
public TResult Result { get; }
public Status Status { get; }
public GuardedResult(TResult result, Status status) {
this.Result = result;
this.Status = status;
}
public static implicit operator GuardedResult<TResult>(TResult result) {
return new GuardedResult<TResult>(result, Status.Success);
}
}
像这样使用:
public partial class EmployeesBusinessLogic {
public GuardedResult<Employee> GetEmployee(Int64 employeeId) {
if( this.CurrentUser.CanReadAll ) {
return this.Data.Employees.GetEmployeeById( employeeId );
}
else if( this.CurrentUser.CanReadSelf ) {
if( this.CurrentUser.EmployeeId == employeeId ) {
return this.Data.Employees.GetEmployeeById( employeeId );
}
else {
return new GuardedResult<Employee>( null, Status.AccessDenied );
}
}
else {
return new GuardedResult<Employee>( null, Status.AccessDenied );
}
}
}
这构建并且工作正常。
但是,当我将TResult
更改为封闭式通用IQueryable
时,它会失败:
public GuardedResult<IQueryable<Employee>> GetEmployees() {
if( this.CurrentUser.CanReadAll ) {
return this.Data.Employees.GetAllEmployees();
}
else {
return new GuardedResult<IQueryable<Employee>>( null, Status.AccessDenied );
}
}
编译错误是:
错误CS0266
无法隐式转换类型&#39;System.Linq.IQueryable<Initech.Employee>
&#39;到&#39;Initech.GuardedResult<System.Linq.IQueryable<Initech.Employee>>
&#39;。
存在显式转换(您是否错过了演员?)
以下是EmployeesData
类的相关定义:
public IQueryable<Employee> GetAllEmployees() {
return this.dbContext.Employees;
}
public Employee GetEmployeeById(Int64 employeeId) {
return this.dbContext.Employees.SingleOrDefault( e => e.EmployeeId == employeeId );
}
答案 0 :(得分:1)
我知道我没有在这里回答你想要的东西,但是as it turns out,隐式铸造操作员在你的情况下不会工作(虽然令人困惑,原因在于规格,但是不要让我试着理解它,并看the answer为什么)
然后,对于您的具体情况,这是一个问题:
return new GuardedResult<IQueryable<Employee>>(
this.Data.Employees.GetAllEmployees(), Status.Success);
再一次,更可能不是你想听到的