我正在使用Entity Framework 6.我有两个类:
public class BookingRecord
{
public int Id {get; set;}
public int CustomerId {get; set;}
[ForeignKey("CustomerId")]
public virtual Customer Customer {get; set;}
......
}
public class Customer
{
public int Id {get; set;}
public int BusinessUnitId {get; set;}
public int UserId {get; set;}
......
}
我将BusinessUnitId作为业务部门的用户。
我的业务逻辑是:
如果用户是管理员,则用户可以打开系统中的所有预订记录。 如果User是Employee,则用户可以在User上使用相同的BusinessUnitId打开所有预订记录。 如果User是RegisteredUser,则用户只能使用与用户相同的UserId打开预订记录。 如果用户是其他角色,则用户根本无法打开预订记录。
所以我为上面的业务逻辑创建了一个Expression for Customer Class。
protected Expression GetUserRoleExtraConditionExpression(ParameterExpression param)
{
Expression expression;
IPrincipal user = HttpContext.Current.User;
if (user.IsInRole(Consts.Roles.Administrator))
{
expression = Expression.Constant(true);
}
else if (user.IsInRole(Consts.Roles.Employee))
{
int businessUnitId = UserManager.FindById(user.Identity.GetUserId()).BusinessUnitId;
expression = Expression.Equal(
Expression.Property(param, typeof(Customer).GetProperty("BusinessUnitId")),
Expression.Constant(businessUnitId));
}
else if (user.IsInRole(Consts.Roles.RegisteredUser))
{
string userId = user.Identity.GetUserId();
expression = Expression.Equal(
Expression.Property(param, typeof(Customer).GetProperty("UserId")),
Expression.Constant(userId));
}
else
{
expression = Expression.Constant(false);
}
return expression;
}
其中ParameterExpression参数是Customer类型的参数。
对于BookingRecord类,我需要在Customer属性上应用相同的逻辑。即,从{DB>中选择上述表达式时,BookingRecord.Customer.BusinessUnitId
和BookingRecord.Customer.UserId
必须应用上述表达式。
如何在BookingRecord上重复使用该方法?
换句话说,如何获得类似于Expression.Property(param, typeof(Customer).GetProperty("BusinessUnitId"))
的表达式,但接受具有BookingRecord类型的param并应用于BookingRecord的CustomerField字段?
像
Expression.Property(param,
typeof(BookingRecord)
.GetProperty(Customer)
.GetProperty("BusinessUnitId"))
答案 0 :(得分:0)
谢谢pinkfloydx33。
Expression.Property(Expression.Property(param,...),...)
正是我所寻找的。 p>
所以我现在的方法是
protected Expression GetUserRoleExtraConditionExpression(Expression param)
{
Expression expression;
IPrincipal user = HttpContext.Current.User;
if (user.IsInRole(Consts.Roles.Administrator))
{
expression = Expression.Constant(true);
}
else if (user.IsInRole(Consts.Roles.Employee))
{
int businessUnitId = UserManager.FindById(user.Identity.GetUserId()).BusinessUnitId;
expression = Expression.Equal(
Expression.Property(param, "BusinessUnitId"),
Expression.Constant(businessUnitId));
}
else if (user.IsInRole(Consts.Roles.RegisteredUser))
{
string userId = user.Identity.GetUserId();
expression = Expression.Equal(
Expression.Property(param, "UserId"),
Expression.Constant(userId));
}
else
{
expression = Expression.Constant(false);
}
return expression;
}
在Customer类的调用者中,我将其称为
GetUserRoleExtraConditionExpression(param);
(param
Customer
类型ParameterExpression
)
在BookingRecord类的调用者中,我将其称为
GetUserRoleExtraConditionExpression(Expression.Property(param, "Customer"))
(param
是BookingRecord
类型ParameterExpression
)