2010-09-30 267 views
2

我有一個名爲LINQ查詢返回的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

+2

你正在顯示的東西看起來像一個LINQ查詢生成的SQL ...你的問題有點不清楚會擴大一點嗎? – bytebender 2010-09-30 15:38:45

+0

這是方法調用返回的linq。在那我想包括一個where類,以便我只能得到屬於角色ID = 15的用戶 – kalls 2010-09-30 15:46:47

回答

1

這應做到:

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

我不能在該方法中使用Where。 – kalls 2010-09-30 15:49:13

1

您可以將您的完整列表

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

我無法使用因爲intellisense不允許我在哪裏。 – kalls 2010-09-30 15:48:22

0

這也很可能是沒有SecurityRoleId上使用where屬性,而不是對象關係。在這種情況下,你將不得不寫下類似於

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 
2

不能使用Where,因爲它只能在IQueryable<T>定義的,strongly-鍵入版本。您需要從GetUsers()投你的IQueryable到合適的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); 
+0

+1將發佈關於'IQueryable'與'IQueryable '相同的觀察結果。不幸的是,OP的方法是這樣定義的。來自MSDN:* IQueryable接口旨在供查詢提供者實現。它只應該由實施IQueryable 的供應商實施。如果提供程序不實現IQueryable ,則標準查詢運算符不能用於提供程序的數據源。* – 2010-09-30 16:02:08

+0

沒有強制運算符定義是我得到的錯誤。 – kalls 2010-09-30 17:31:57

+0

@Kalls - 您可能必須手動執行強制轉換([msdn](http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx)),除非您可以指定'ModelType'爲任何類型的Queryable中的對象已經是。 – kevingessner 2010-09-30 18:11:27

1

你有

using System.Linq 
在包括

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

是一個擴展方法在System.Linq的名稱空間中發現的IQueryable的類型。