C# 筛选数据源,以便用户只能查看自己的信息
在我的一个屏幕上,我有一个表格,显示客户公司的信息。现在,我正在尝试筛选数据源,以便X公司的用户只能查看X公司的信息,而不能查看Y公司或Z公司的信息。我创建了一个包含aspnet_用户guid的表CustomerUser,以及CustomerID,以便公司可以创建多个用户 这是我到目前为止得到的,但它似乎陷入了一个无限循环,因为它抛出了一个StackOverflowExceptionC# 筛选数据源,以便用户只能查看自己的信息,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<
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)
{
}
}
}