2

ユーザー名のリストに特定の役割を持つすべてのユーザーを取得したいと考えています。

.Include を使用してすべてのユーザーを含め、UsersReference を使用して、ロールに関連付けられているすべてのユーザーをループする最良の方法はありますか?

foreach(User user in role.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();
        }
4

3 に答える 3

2

Role テーブルに Users プロパティがある可能性はありますか? UsersReference ではなく、ナビゲーション プロパティの名前が Users になると思います。私は EF を使用しませんが、私が見たすべての例では、テーブルの後にプロパティに名前を付けています。私の知る限り、常にIEnumerableを実装しているため、foreachで使用できるはずです。

正しく設定されている場合は、次のものだけが必要だと思います。

using (var context = new MyEntities())
{
    return context.Roles
                  .Where( r => r.RoleName == roleName )
                  .SelectMany( r => r.Users )
                  .Select( u => u.UserName )
                  .ToArray();
}
于 2010-03-21T13:34:40.653 に答える
0

ToList ()で元の foreach ループを使用してみてください

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

于 2010-03-21T13:25:25.240 に答える
-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 で使用されるため、含める必要なく 1 つのクエリに含めることができます。

補足として、このメソッドのメソッド シグネチャが何であるかはわかりませんが、他のタイプのコレクションから配列を作成せずに後で実装を調整できるため、この場合IEnumerable<string>はおそらく よりも適しています。string[]

于 2010-03-21T13:36:31.260 に答える