0

MVC3、C#、.NET4、EF5 を使用しています。ASP.NET メンバーシップ プロバイダーを使用しています。モデルは 1 ユーザーの多くのロールをサポートしていますが、ユーザーごとに 1 つのロールを使用しています。

ユーザー情報を抽出するときに、LINQ クエリでこの 1 つのロールを抽出する必要があります。要するに、特定のユーザーの「First()」ロール レコードが必要なだけです。

AspNet.Membership テーブルと 1 対 1 で対応する Application User テーブルがあります。

次のようなものです:

List<StdOrgUser> myUsers = Model.Select(i => new StdOrgUser(){
    Id=i.Id,
    Rolename = i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.FirstOrDefault().RoleName
}).ToList();

また、Intellisense により上記のコードを記述できましたが、実際には実行されません。このレコードのユーザー詳細とともに、この 1 つのロール名の値を取得するにはどうすればよいですか? このモデルは表示のために WebGrid に入ります。

編集:

私の修正されたコード、null テスト前のアドバイス!

var myUsers = Model.Select(i => new{ 
    Id = i.Id, 
    Firstname = i.Firstname, 
    initials = i.Initials, 
    Lastname = i.Lastname, 
    Username = i.Aspnet_Membership.Aspnet_Users.UserName, 
    RoleName = i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.FirstOrDefault().RoleName, 
        Organisation = i.StdOrg.Name 
}).ToList();

EDIT2:ヌルテストを投稿:

var myUsers = Model.Select(i => new { 
    Id = i.Id, 
    Firstname = i.Firstname, 
    initials = i.Initials, 
    Lastname = i.Lastname, 
    Username = i.Aspnet_Membership.Aspnet_Users.UserName, 
    RoleName = i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.Any() ? i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.FirstOrDefault().RoleName : "No Roles",
        Organisation = i.StdOrg.Name 
    }).ToList();

次に、この 2 番目のモデルを webgrid にフィードします。

4

2 に答える 2

1

RoleName プロパティへのアクセスをクエリ パイプラインの少し上に移動する必要があります。現在、あなたはこれをやっています:

i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.FirstOrDefault().RoleName

したがってAspnet_Roles.FirstOrDefault()、デフォルト ( null) を返す場合は、null ref 例外が発生します。代わりに、最初Aspnet_Rolesに に投影し、次に を使用する必要があります。RoleName FirstOrDefault()

 i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.Select(ar => ar.RoleName).FirstOrDefault()

デフォルトの役割で代用する必要がある場合は、合体できます。

 i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.Select(ar => ar.RoleName).FirstOrDefault() ?? "No Role"

これにより、ヌルのチェックに使用する場合と比較して、クエリが冗長になりませんAny(また、SQL 側でもより効率的になります)。

于 2013-08-25T13:22:53.233 に答える