C# EF-导航属性说明

C# EF-导航属性说明,c#,asp.net,entity-framework-4,C#,Asp.net,Entity Framework 4,我使用ASP.NET4.0附带的EF4和成员资格提供程序 我需要找到特定角色中的所有用户,并使用List填充下拉列表 涉及的数据库表包括: aspnet_Roles aspnet_Users aspnet_UsersInRoles 从aspnet_用户到aspnet_角色的导航属性(使用连接表aspnet_UsersInRoles)为: 匹配角色ID(Guid)“CE44ED48-E9F9-49C6-9E15-E40EEFDC7479”) 我的剧本: using (CmsCon

我使用ASP.NET4.0附带的EF4和成员资格提供程序

我需要找到特定角色中的所有用户,并使用
List
填充下拉列表

涉及的数据库表包括:

aspnet_Roles
aspnet_Users
aspnet_UsersInRoles
从aspnet_用户到aspnet_角色的导航属性(使用连接表aspnet_UsersInRoles)为:

匹配角色ID(Guid)“CE44ED48-E9F9-49C6-9E15-E40EEFDC7479”)

我的剧本:

        using (CmsConnectionStringEntityDataModel context = new CmsConnectionStringEntityDataModel())
        {
            IQueryable<aspnet_Users> userQuery = from aspnet_Users in context.aspnet_Users select aspnet_Users;
            IQueryable<aspnet_Roles> roleQuery = from aspnet_Roles in context.aspnet_Roles select aspnet_Roles;
            List<ListItem> myListUsersInRoles = new List<ListItem>();
            foreach (aspnet_Users myUser in userQuery)
            {
            // PROBLEM HERE
            if (myUser.aspnet_Roles.ToString() == "CE44ED48-E9F9-49C6-9E15-E40EEFDC7479")
                myListUsersInRoles.Add(new ListItem(myUser.UserName.ToString(), myUser.UserId.ToString()));

            uxListUsers.DataSource = myListUsersInRoles;
            uxListUsers.DataBind();
        }`
使用(CmsConnectionStringEntityDataModel上下文=新的CmsConnectionStringEntityDataModel())
{
IQueryable userQuery=来自上下文中的aspnet\u用户。aspnet\u用户选择aspnet\u用户;
IQueryable roleQuery=从上下文中的aspnet\u角色。aspnet\u角色选择aspnet\u角色;
List myListUsersInRoles=新列表();
foreach(用户查询中的aspnet\u用户myUser)
{
//这里有问题
if(myUser.aspnet_Roles.ToString()=“CE44ED48-E9F9-49C6-9E15-E40EEFDC7479”)
添加(新列表项(myUser.UserName.ToString(),myUser.UserId.ToString());
uxListUsers.DataSource=myListUsersInRoles;
uxListUsers.DataBind();
}`
问题: 如果始终返回FALSE,则无法填充列表。 我想我在一些属性上做得不对


你有什么想法吗?谢谢你的时间。

myUser.aspnet_Roles是一个
实体集
(换句话说,是一个角色集合,因此它的字符串表示形式很可能恰好与你要查找的角色ID的字符串表示形式相匹配

有几种方法可以修复它。一种是:

// ...
if (myUser.aspnet_Roles.Any(r => r.RoleId.ToString() == "CE44ED48-E9F9-49C6-9E15-E40EEFDC7479"))
// ...
还请注意,从x中的y选择y与x中的y相同,因此您可以编写

foreach (aspnet_User myUser in context.aspnet_Users)
// ...
而且不用费心声明
userQuery
roleQuery
(您实际上似乎并没有在任何地方使用
roleQuery

此外,您还可以查看使用成员资格/角色API获取角色中的用户:

using System.Web.Security; // at the top of your file
var usersInRole = Roles.GetUsersInRole("name of role here, NOT the guid");

请注意,这将返回一个用户名数组,而不是用户对象,因此您需要做一些额外的工作来获取用户ID,但这是您可以考虑的…

感谢John的解释。最后我了解了它的工作原理。我使用了if(myUser.aspnet_Roles.Any(r=>r.RoleName==“CMS-AUTHOR”))它工作得很好!我也会尝试使用System.Web.Security,因为你很难过。再次非常感谢你的帮助!对不起,John,最后一件事…你能告诉我IQueryable的一个常用示例吗?我是一个真正的初学者。谢谢!
using System.Web.Security; // at the top of your file
var usersInRole = Roles.GetUsersInRole("name of role here, NOT the guid");