[英]How can I get Property Expression for field of a property
我正在使用Entity Framework 6.我有2個類:
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屬性上應用相同的邏輯。 即, BookingRecord.Customer.BusinessUnitId
和BookingRecord.Customer.UserId
必須在從DB中選擇時應用上述表達式。
如何在BookingRecord上重復使用該方法?
換句話說,如何獲得類似Expression.Property(param, typeof(Customer).GetProperty("BusinessUnitId"))
但接受具有Expression.Property(param, typeof(Customer).GetProperty("BusinessUnitId"))
類型的param並應用於Expression.Property(param, typeof(Customer).GetProperty("BusinessUnitId"))
的CustomerField字段? 就像是
Expression.Property(param,
typeof(BookingRecord)
.GetProperty(Customer)
.GetProperty("BusinessUnitId"))
謝謝pinkfloydx33。 Expression.Property(Expression.Property(param,...),...)
正是我所尋找的。
所以我現在的方法是
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
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.