簡體   English   中英

如何獲取屬性字段的Property Expression

[英]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.BusinessUnitIdBookingRecord.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);

paramCustomer類型ParameterExpression

在BookingRecord類的調用者中,我將其稱為

GetUserRoleExtraConditionExpression(Expression.Property(param, "Customer"))

param是一個BookingRecord類型的ParameterExpression

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM