如何获取属性

时间:2017-02-26 00:17:15

标签: c# entity-framework lambda linq-to-entities linq-expressions

我正在使用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.BusinessUnitIdBookingRecord.Customer.UserId必须应用上述表达式。

如何在BookingRecord上重复使用该方法?

换句话说,如何获得类似于Expression.Property(param, typeof(Customer).GetProperty("BusinessUnitId"))的表达式,但接受具有BookingRecord类型的param并应用于BookingRecord的CustomerField字段? 像

这样的东西
Expression.Property(param,
    typeof(BookingRecord)
        .GetProperty(Customer)
        .GetProperty("BusinessUnitId"))

1 个答案:

答案 0 :(得分:0)

谢谢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"))

paramBookingRecord类型ParameterExpression