Лямбда-область для метода Entity_Filter — MS Lightswitch 2012

Я начинающий программист, работающий над приложением 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();
    }
}

person Ethan48    schedule 04.06.2013    source источник


Ответы (1)


Наконец-то я нашел правильные ключевые слова для поиска, чтобы найти ответ. Я публикую на случай, если у кого-то еще возникнет такой же вопрос.

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);

Я до сих пор не уверен, почему другой способ не сработал, но он делает именно то, что я хочу, поэтому я доволен.

person Ethan48    schedule 06.06.2013