从Lightswitch中的服务器项目中的公共项目中设置的访问变量

时间:2014-01-16 18:40:43

标签: c# asp.net visual-studio-2012 visual-studio-lightswitch lightswitch-2012

所以我已经重做了上一个问题的一些代码,但是同样的根本问题仍然存在。我想要做的是:当我的lightswitch应用程序通过Application.cs启动时,我使用方法Application_LoggedIn()来调用我的Common Project中的一个函数来获取用户可以访问的所有位置(这个数据存储在表格中。

客户项目 - Application.cs

  partial void Application_LoggedIn()
    {
        Secure.Membership aa = new Membership();
        aa.membership();
    }

Common Project - 调用方法后,我在membership()函数中运行查询以获取用户有权访问的所有位置。它们存储在三个列表中:estateList,deptList,groupList;

public void membership() {

    List<int> estateList = new List<int>();
    List<int> deptList = new List<int>();
    List<int> groupList = new List<int>();

    var dws = Application.Current.CreateDataWorkspace().sspData;
    String uName = Application.Current.User.Identity.Name;
    try
    {
        var qryUser = (from a in dws.aspnet_Users
                       where a.UserName == uName
                       select a).Execute().Single();

        int membershipId = qryUser.Payroll_MembershipGroup.Id;
        var qryOrgMember = (from a in dws.PayrollOrg_MembershipGroups
                            where a.Payroll_MembershipGroup.Id == membershipId
                            select a).Execute().ToList();

        foreach (var x in qryOrgMember)
        {

            if (!estateList.Contains(x.Payroll_Organisation.Estate1.ID))
            {
                estateList.Add(x.Payroll_Organisation.Estate1.ID);
            }
            if (!deptList.Contains(x.Payroll_Organisation.Estate1.ID))
            {
                deptList.Add(x.Payroll_Organisation.Department1.ID);
            }
            if (!groupList.Contains(x.Payroll_Organisation.Estate1.ID))
            {
                groupList.Add(x.Payroll_Organisation.Payroll_Group1.ID);
            }
        }
    }
    catch (Exception e)
    {

        Debug.WriteLine("***************" + e.InnerException);
    }

}

执行此操作后我想要的是能够从我的服务器项目中访问3个列表(庄园,部门,组),这样我就可以使用该列表对我的实体执行过滤,如下所示。

partial void Employee_Employs_Filter(ref Expression<Func<Employee_Employ, bool>> filter)
{ 
   filter = e => estateList.Contains(e.Estate1.ID) && deptList.Contains(e.Substantive_Department) && groupList.Contains(e.Payroll_Group1.ID);
}

这就是我想要做的事情,我遇到了问题。任何建议都会受到欢迎。我试图做的是在我的Common Project中创建一个静态类,然后设置值,但是当一个用户正确指出时,我不能这样做,因为当我尝试从我的Server Project中调用它时它将为null。请帮帮我,这是我对这个应用程序的一个大问题,是唯一剩下的部分。提前谢谢。

** * ** * ** * 的*** 在服务器端过滤代码 * @Duran这就是我在服务器端所拥有的。

public List<User> membership() {

    List<User> aList = new List<User>();
    User aUser = new aUser();


    var dws = Application.Current.CreateDataWorkspace().sspData;
    String uName = Application.Current.User.Identity.Name;
    try
    {
        var qryUser = (from a in dws.aspnet_Users
                       where a.UserName == uName
                       select a).Execute().Single();

        int membershipId = qryUser.Payroll_MembershipGroup.Id;
        var qryOrgMember = (from a in dws.PayrollOrg_MembershipGroups
                            where a.Payroll_MembershipGroup.Id == membershipId
                            select a).Execute().ToList();

        foreach (var x in qryOrgMember)
        {

            aUser.estateId = x.estateId
            auser.deptId = x.deptId;
            aUser.groupId = x.groupId;

            aList.add(aUser);
        }
    }
    catch (Exception e)
    {

        Debug.WriteLine("***************" + e.InnerException);
    }

    return aList;

}

public class User{

    public estateId{set;get:}
    public deptId{set;get:}
    public groupId{set;get:}

}

Now in my filter i would call the method membership() that returns a list<User>

partial void Employee_Employs_Filter(ref Expression<Func<Employee_Employ, bool>> filter)
{ 
    var x = membership();
    estId[int] = new [x.count()];
    deptId[int] = new [x.count()];
    groupId[int] = new [x.count()];

    for (int i=0; i<x.count();i++){
         estId[i] = x.elementAt(i).estateId;
         deptId[i] = x.elementAt(i).deptId;
         groupId[i] = x.elementAt(i).groupId;

    }

   filter = e => estId.Contains(e.Estate1.ID) && deptId.Contains(e.Substantive_Department) && groupId.Contains(e.Payroll_Group1.ID);
}

我必须在我的所有表上放置一个类似于上面的过滤器,那就是当我得到stackoverflow错误时。它只在ONE桌子上工作 但不是在所有桌子上。我做错了什么?

1 个答案:

答案 0 :(得分:1)

即使通用项目中的代码客户端&amp; 服务器项目,在那里创建的任何变量都有自己独立的实例,一个在 Client 项目中,&amp; 服务器项目中的一个。

所以你根本没有真正访问单个共享变量,这就是为什么当你在一个层上设置一个值时,另一个层上的值并不反映这个值的变化,因为它们实际上是变量的两个不同实例。