Я начинающий программист, работающий над приложением 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;
}
}
Последняя строка, устанавливающая фильтр, не работает, а на экране переключателя вместо данных отображается красный крестик с наведением курсора «Невозможно загрузить данные. Пожалуйста, проверьте подключение к сети и повторите попытку». Я знаю, что эта строка является проблемой, потому что отладчик показывает, что все остальные переменные верны, прежде чем эта строка будет выполнена, и подстановка в закомментированную строку не вызывает ошибку.
Я переопределил функции отдела .Equals() (код ниже), чтобы убедиться, что .Contains() работает правильно, но, что любопытно, точка останова в каждом из этих методов никогда не срабатывает. Это заставляет меня задаться вопросом, не выполняется ли лямбда, как я это понял.
Все это означает, что я неправильно понимаю синтаксис оператора лямбда? Есть ли лучший способ выполнить эту проверку? Любые советы или предложения будут с благодарностью.
Большое спасибо, -- Итан
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();
}
}