我是一名新手程序员,正在开发一个 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();
}
}