尚未担任任何角色的用户列表(具有 SimpleMembership 和 entity framework 5 的 MVC4)

List of users that not yet in any role, (MVC4 with SimpleMembership and entity framework 5)

我在 entity framework 中使用 mvc 4。我需要尚未分配任何角色的所有用户的列表。我在角色中找不到任何预定义函数。

输出将是。

我目前的代码如下。

var users = db.UserProfileEFMs
    .ToList()
    .Where(o => !Roles.GetRolesForUser(o.UserName).ToList<string>().Any())
    .ToList();

但它工作不正常或速度太慢。 有没有其他方法可以获得这种列表。

我正在为像这样的角色寻找扩展方法。

public static class Extentions
{
public static List<string>/*UserName*/ UsersNotInAnyRole(this Roles /*System.Web.Security*/ roles)
{
    /*----code----*/
}
}

目前我正在使用以下代码

var users = db.Database.SqlQuery<UserProfile>("select * from dbo.UserProfile where UserId not in(select UserId from dbo.webpages_UsersInRoles)").ToList();

你不需要那么多调用ToList()——下面的代码等同于你所拥有的。

var users = db.UserProfileEFMs
    .Where(o => !Roles.GetRolesForUser(o.UserName).Any())
    .ToList();

不需要第一个 ToList(),因为无论如何您都将评估 db.UserProfileEFMs 中的所有项目。

第二个 ToList<string>() 强制计算 GetRolesForUser 的所有值,即使您只关心是否有任何值,这很浪费。


您是否尝试过将其拆分为 foreach 循环并对其进行分析,例如

var users = new List<T>;
foreach ( var userProfileEFM in db.UserProfileEFMs)
{
    if ( !Roles.GetRolesForUser(userProfileEFM.UserName).Any() )
        users.Add(userProfileEFM)
}

其中 Tdb.UserProfileEFMs 中项目的类型。

我没有找到更好的解决方案。我认为以下是最好的。

var users = db.Database.SqlQuery<UserProfile>("select * from dbo.UserProfile where UserId not in(select UserId from dbo.webpages_UsersInRoles)").ToList();