簡體   English   中英

返回IQueryable的Linq查詢

[英]Linq Query that returns IQueryable

我有一個方法叫做

     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。

您不能使用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);

應該這樣做:

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

您可以在完整列表中使用一個位置

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

你有

using System.Linq

在您的包括?

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

是System.Linq命名空間中IQueryable類型的擴展方法。

也很可能在類中沒有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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM