C# 筛选数据源,以便用户只能查看自己的信息

C# 筛选数据源,以便用户只能查看自己的信息,c#,sql,visual-studio-lightswitch,C#,Sql,Visual Studio Lightswitch,在我的一个屏幕上,我有一个表格,显示客户公司的信息。现在,我正在尝试筛选数据源,以便X公司的用户只能查看X公司的信息,而不能查看Y公司或Z公司的信息。我创建了一个包含aspnet_用户guid的表CustomerUser,以及CustomerID,以便公司可以创建多个用户 这是我到目前为止得到的,但它似乎陷入了一个无限循环,因为它抛出了一个StackOverflowException partial void Customers_Filter(ref Expression<Func<

在我的一个屏幕上,我有一个表格,显示客户公司的信息。现在,我正在尝试筛选数据源,以便X公司的用户只能查看X公司的信息,而不能查看Y公司或Z公司的信息。我创建了一个包含aspnet_用户guid的表CustomerUser,以及CustomerID,以便公司可以创建多个用户

这是我到目前为止得到的,但它似乎陷入了一个无限循环,因为它抛出了一个StackOverflowException

partial void Customers_Filter(ref Expression<Func<Customer, bool>> filter)
    {
        //if (!Application.Current.User.HasPermission(Permissions.SecurityAdministration))
        //{
            //Guid guid = (Guid)Membership.GetUser().ProviderUserKey;                
            Guid guid = new Guid("1657d378-4b8b-ed4e-f928-bb48fc83bf18");

            IEnumerator cusUsers = this.CustomerUsers.GetEnumerator();

            CustomerUser current;
            CustomerUser found = null;
            while (cusUsers.MoveNext())
            {
                current = (CustomerUser)cusUsers.Current;

                if (current.GebruikerID == guid)
                {
                    found = current;
                }
            };

            try
            {                
                if (found != null)
                {
                    filter = e => e.CustomerID == found.Customer1.CustomerID;
                }
                else
                {
                    filter = e => e.CustomerID == "-1";
                }
            }
            catch (Exception ex)
            {

            }

        //}
    }
CustomerUsers的枚举器很可能有bug

但是,当找到正确的用户时,应该添加一个中断

       while (cusUsers.MoveNext())
       {
            current = (CustomerUser)cusUsers.Current;

            if (current.GebruikerID == guid)
            {
                found = current;
                break;  // stop searching 
            }
        };


好的,对于任何有相同isue的人来说,在这个问题上遇到了障碍:我添加了一个新的查询并对其进行了预处理,而不是过滤数据集,这解决了我的问题。像这样:

partial void CustomersByLoggedInUser_PreprocessQuery(ref IQueryable<Customer> query)
    {
    if (!Application.Current.User.HasPermission(Permissions.SecurityAdministration))
    {
        Guid guid = (Guid)Membership.GetUser().ProviderUserKey;                

        IEnumerator cusUsers = this.CustomerUsers.GetEnumerator();

        CustomerUser current;
        CustomerUser found = null;
        while (cusUsers.MoveNext())
        {
            current = (CustomerUser)cusUsers.Current;

            if (current.GebruikerID == guid)
            {
                found = current;
            }
        };

        try
        {                
            if (found != null)
            {
                filter = e => e.CustomerID == found.Customer1.CustomerID;
            }
            else
            {
                filter = e => e.CustomerID == "-1";
            }
        }
        catch (Exception ex)
        {

        }

    }
}

创建一个带有where guid=userguid条件的视图,让用户只访问视图,而不访问基表。我不确定你的意思,我已经很久没有使用Lightswitch了。我也没有。。。我的评论更多的是一个通用的解决方案,甚至不知道它是否适用于您的具体情况。你好,Richard,谢谢您的回答,但它似乎并没有修复StackoverflowException。我会离开休息时间;不过,在代码中,我没有想到添加这一点。
partial void CustomersByLoggedInUser_PreprocessQuery(ref IQueryable<Customer> query)
    {
    if (!Application.Current.User.HasPermission(Permissions.SecurityAdministration))
    {
        Guid guid = (Guid)Membership.GetUser().ProviderUserKey;                

        IEnumerator cusUsers = this.CustomerUsers.GetEnumerator();

        CustomerUser current;
        CustomerUser found = null;
        while (cusUsers.MoveNext())
        {
            current = (CustomerUser)cusUsers.Current;

            if (current.GebruikerID == guid)
            {
                found = current;
            }
        };

        try
        {                
            if (found != null)
            {
                filter = e => e.CustomerID == found.Customer1.CustomerID;
            }
            else
            {
                filter = e => e.CustomerID == "-1";
            }
        }
        catch (Exception ex)
        {

        }

    }
}