我有一个名为
的方法 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。
答案 0 :(得分:2)
您无法使用Where
,因为它仅在IQueryable<T>
(强类型版本)上定义。您需要将IQueryable
从GetUsers()
投射到适当的IQueryable<T>
:
var users = GetUsers().Cast<ModelType>();
ModelType
应该是来自GetUsers
的模型对象的任何类型;它应该有SecurityRoleID
,ApplicationUserId
或您需要的任何属性。
然后您可以使用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