返回IQueryable的Linq Query

时间:2010-09-30 15:33:17

标签: c# linq

我有一个名为

的方法
     public static IQueryable GetUsers()

使用Linq查询。

{SELECT [t0].[ApplicationUserId], ([t0].[LastName] + @p0) + [t0].[FirstName] AS [UserName], [t1].[SecurityRoleName], [t2].[UserStatus]
    FROM [dbo].[ApplicationUsers] AS [t0]
    INNER JOIN [dbo].[SecurityRoles] AS [t1] ON [t0].[SecurityRoleId] = [t1].[SecurityRoleID]
    INNER JOIN [dbo].[UserStatusLookups] AS [t2] ON [t0].[UserStatusId] = [t2].[UserStatusLookupID]
    ORDER BY [t0].[LastName]
}

返回所有用户。我无法改变这种方法或类。

我需要属于特定安全角色的用户。从IQueryable可以获得特定用户。 以便[t1].[SecurityRoleID]替换为15。

5 个答案:

答案 0 :(得分:2)

您无法使用Where,因为它仅在IQueryable<T>(强类型版本)上定义。您需要将IQueryableGetUsers()投射到适当的IQueryable<T>

var users = GetUsers().Cast<ModelType>();

ModelType应该是来自GetUsers的模型对象的任何类型;它应该有SecurityRoleIDApplicationUserId或您需要的任何属性。

然后您可以使用LINQ扩展方法:

var user = users.Where(u => u.SecurityRoleID == 15);

或者也许:

var user = users.FirstOrDefault(u => u.SecurityRoleID == 15);

答案 1 :(得分:1)

这应该这样做:

var Role15Users = GetUsers().Where(t => t.SecurityRoldID == 15);

答案 2 :(得分:1)

您可以使用完整列表中的位置

var users = MyClass.GetUsers();
var userInRole = users.Where(u=>u.SecurityRoleId == 15);

答案 3 :(得分:1)

你有吗

using System.Linq

在你的包含中?

Where<TSource> Method (IQueryable<TSource>, Expression<Func<TSource, Boolean>>)

是System.Linq命名空间中的IQueryable类型的扩展方法。

答案 4 :(得分:0)

类中很可能没有SecurityRoleId属性,而是对象关系。在这种情况下,您必须编写类似

的内容
var roleUsers = dataSource.GetUsers().Where(
    u => u.SecurityRole.Id == 15
    );

它将返回角色为#15的所有用户 但是你必须知道魔术数字很糟糕。

如果要查找名为Admin的角色的单个用户,请确保正确映射SecurityRole(取决于您尚未发布的类结构)并做一些类似

的事情
var admin = (from user in dataSource.GetUsers()
            where user.SecurityRole.Name == "Administrator"
            select user).Single(); // will throw exception if none or multiple are found


var admin = (from user in dataSource.GetUsers()
            where user.SecurityRole.Name == "Administrator"
            select user).SingleOrDefault(); // will return null if none, throw exception if multiple are found

您还可以使用方法调用方式重写这些查询:

var admin = dataSource.GetUsers()
    .Where(u => u.SecurityRole.Name == "Administrator")
    .Single(); // will throw exception if none or multiple are found

var admin = dataSource.GetUsers()
    .Where(u => u.SecurityRole.Name == "Administrator")
    .SingleOrDefault(); // will return null if none, throw exception if multiple are found