0

我是一名新手程序员,正在开发一个 MS Lightswitch 应用程序,以帮助我公司中的其他人进行购买。其中一项要求是,用户只能查看已计入他们有权查看的预算线的购买。我有一个用户表,我可以从 Application.User.Name 属性中成功识别它,还有另一个部门表。两者通过我命名为 PermissionGlues 的另一个表以多对多的关系连接。

所有这些都有效,我的问题在于 _Filter 方法本身。我当前的代码如下。

partial void TransactionLines_Filter(ref Expression<Func<TransactionLine, bool>> filter)
    {
        //This is going to be a list of departments this user is allowed to see.
        List<Department> AllowedDepartments = new List<Department>();

        IEnumerable<User> UserEntities = (from User u in this.Users where u.UserName == Application.User.Name select u);
        User UserEntity = UserEntities.FirstOrDefault();
        if (UserEntity == null)
        {
            //The system user does not have an account
            filter = TL => false;
            return;
        }

        foreach(PermissionsGlue thisGlue in UserEntity.PermissionsGlues)
        {
            AllowedDepartments.Add(thisGlue.Department);
        }

        if (!this.Application.User.HasPermission(Permissions.NoFilter))
        {
            filter = TL => AllowedDepartments.Contains(TL.CreditDepartment);
            //filter = TL => true;
        }
    }

设置过滤器的最后一行不起作用,灯开关屏幕显示红色 X 而不是鼠标悬停的数据“无法加载数据。请检查您的网络连接并重试。” 我知道这行是问题所在,因为调试器在此行执行之前显示所有其他变量都是正确的,并且在注释行中替换不会导致错误。

我已经覆盖了部门 .Equals() 函数(下面的代码)以确保 .Contains() 能够正常工作,但奇怪的是,这些方法中的每一个中的断点都不会被命中。这让我想知道 lambda 是否没有按照我的理解执行。

这就是说,我是不是误解了 lambda 语句的语法?有没有更好的方法来执行此检查?任何意见或建议将不胜感激。

谢谢你,--Ethan

public partial class Department
{
    partial void DepartmentNumber_Validate(EntityValidationResultsBuilder results)
    {
        if (DepartmentNumber != null)
        {
            if (DepartmentNumber.Length != 2)
                results.AddPropertyError("Department must be 2 digits.");
        }
    }

    public bool Equals(Department that)
    {
        if (that == null)
            return false;

        return this.DepartmentNumber == that.DepartmentNumber;
    }

    public override bool Equals(object that)
    {
        if (that != null && that is Department)
        {
            Department otherDept = (Department)that;
            return this.DepartmentNumber == otherDept.DepartmentNumber;
        }
        else
        {
            return false;
        }

    }

    public override int GetHashCode()
    {
        return this.DepartmentNumber.GetHashCode();
    }
}
4

1 回答 1

2

我终于找到了正确的搜索关键字来找到答案。我发帖以防其他人有同样的问题。

http://social.msdn.microsoft.com/Forums/en-US/lightswitch/thread/135e7686-428b-4f70-a712-8f56232fb550

事实证明,这一切都可以通过一行代码实现:

filter = TL => TL.CreditDepartment.PermissionsGlues.Any(g => g.User.UserName == Application.User.Name);

我仍然不确定为什么其他方式不起作用,但这正是我想要的,所以我很高兴。

于 2013-06-06T13:29:25.737 回答