2010-03-21 92 views
2

我想讓所有具有特定角色的用戶都成爲用戶名列表。循環通過entityreference的正確方法?

正在使用.Include包括所有用戶,並通過UsersReference 循環瀏覽與該角色關聯的所有用戶的最佳方式?

我注意到我無法做一個foreach(User.Users中的用戶用戶),但UsersReference似乎工作,但它是如何完成的?閱讀參考資料?

using (var context = new MyEntities()) 
     { 
      List<string> users = new List<string>(); 

      Role role = (from r in context.Roles.Include("Users") 
         where r.RoleName == roleName 
         select r).FirstOrDefault(); 

      foreach (User user in role.UsersReference) 
       users.Add(user.UserName); 

      return users.ToArray(); 
     } 

回答

0

嘗試使用原來的foreach循環用ToList()

foreach(var user in role.Users.ToList()) {...}

+0

這會導致只需要IEnumerables的情況下創建第三個集合。 '列表用戶','.ToArray()'的結果和'.ToList()'的結果 – 2010-03-21 13:41:06

+1

問題是如何遍歷所有用戶而不是用戶名。 – ktingle 2010-03-21 13:58:05

+0

現在的問題是:我想讓所有具有特定角色的用戶都成爲用戶名列表。問題中提供的代碼返回一個包含指定角色中所有用戶的用戶名的字符串[]。即使循環遍歷用戶將是分配,ToList也不需要。 – 2010-03-21 15:41:30

2

有沒有可能是你的角色表中有一個用戶的財產?我會認爲它會命名導航屬性Users,而不是UsersReference。我不使用EF,但是我看過的所有例子都是在表格後命名的。 AFAIK它總是實現IEnumerable,所以你應該可以在foreach中使用它。

如果您有它樹立正確的,我認爲你只需要:

using (var context = new MyEntities()) 
{ 
    return context.Roles 
        .Where(r => r.RoleName == roleName) 
        .SelectMany(r => r.Users) 
        .Select(u => u.UserName) 
        .ToArray(); 
} 
+1

Include方法不是必需的,因爲相關的User對象正在一個活動的ObjectContext內被訪問。 – 2010-03-21 13:41:20

+0

@Enrico - 謝謝,我誤將它留下了(複製/粘貼)。 – tvanfosson 2010-03-21 17:50:25

-1

使用.ToArray()幫手,而不是

using (var context = new MyEntities()) 
{ 
    return (from role in context.Roles 
      where role.RoleName == roleName 
      from user in r.Users 
      select user.UserName).ToArray(); 
} 

注意,沒有必要爲.Include("Users"),如果你做這種方式。在查詢中使用r.Users會導致它在一個查詢中,而不需要包含它,因爲它在活動的ObjectContext中使用。

一個方面說明,我不確定此方法的方法簽名是什麼,但在這種情況下,IEnumerable<string>可能比string[]更合適,因爲您可以稍後調整實現而不創建其他類型的數組集合。