私は、社内の他のユーザーが購入を入力できるように、MS Lightswitch アプリケーションに取り組んでいる初心者のプログラマーです。要件の 1 つは、ユーザーが表示を許可されている予算ラインに請求された購入のみを表示できることです。Application.User.Name プロパティから正常に識別できるユーザーのテーブルと、部門の別のテーブルがあります。この 2 つは、私が 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() が適切に機能することを確認しましたが、不思議なことに、これらの各メソッドのブレークポイントは決してヒットしません。これは、私が理解しているようにラムダが実行されていないかどうか疑問に思っています。
つまり、ラムダステートメントの構文を誤解していますか? このチェックを実行するより良い方法はありますか? アドバイスや提案をいただければ幸いです。
よろしくお願いします。 -- イーサン
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();
}
}