1

テーブルの単純なメンバーシップUserProfilesに似ていますRolesUserInRoles

このコードを使用UserProfilesClientsて、テーブル内のとの間の関係を作成しましたUserInClients

modelBuilder.Entity<UserProfiles>()
            .HasMany<dbClient>(r => r.Clients)
            .WithMany(u => u.UserProfiles)
            .Map(m =>
            {
                m.ToTable("webpages_UsersInClients");
                m.MapLeftKey("ClientId");
                m.MapRightKey("UserId");
            });

UserProfilesには がありpublic virtual ICollection<dbClient> Clients { get; set; }、私にClientsは がありますpublic virtual ICollection<UserProfiles> UserProfiles { get; set; }

  • モデルを見る必要がある場合は、投稿できることをお知らせください

モデルとビューで私がしたい

  1. すべてのクライアント ( Distinct ) を表示し、そのクライアントにアクセスできるユーザー数を表示します
  2. 現在ログインしているユーザーが表示を許可されているクライアントのみを表示するビューを作成します。

モデル Clients.ClientID のプロパティにアクセスするのと同じくらい簡単だと思っていました。うまくいかない。

私の他の考えは、(作成したテーブルのように) CliendID と UserID を含むモデルを作成していたので、コントローラーで結合を使用して正しい値を見つけることができますか??


最後に、私が達成しようとしているのはKendoUI CascadingDropDownList、この行をGetCascadeClients JsonResult

return Json(db.Clients.Select(c => new { ClientID = c.ClientID, ClientName = c.Client }), JsonRequestBehavior.AllowGet);

私の質問は、コントローラーにいるとき、Entity Framework によって作成されたこのテーブルにどのようにアクセスするのですか?

編集:

SOLUTION QUERY両方の回答をつなぎ合わせる

  return Json(db.Clients
              .Include(c => c.UserProfiles)
              .Where(c => c.UserProfiles.`Any(up => up.UserName == User.Identity.Name))`
              .Select(c => new
              {
                  ClientID = c.ClientID,
                  ClientName = c.Client,
                  UserCount = c.UserProfiles.Count()
              }),
              JsonRequestBehavior.AllowGet);
4

2 に答える 2

2

次のようなものを試してください:

return JSON (db.Clients
              .Include(c => c.UserProfiles)
              .Where(c => c.UserProfiles.UserId == loggedInUserId)
              .Select( c => new {
                            ClientId = c.ClientID,
                            ClientName = c.Client,
                            UserCount = c.UserProfiles.Count()}),
              JsonRequestBehavior.AllowGet);

.Include() 拡張機能を使用すると、すべての UserProfiles を Clients と共に取得できるようになり、そのテーブルをフィルタリング、レコード数などに使用できるようになります。.Where 句には実際に何らかの作業が必要になる場合がありますが、これは次のようにする必要があります。堅実なスタート。

于 2013-08-17T03:10:08.947 に答える
1

これは実際にはLINQの質問です。

db.Clients
    .Where(c => c.UserProfiles.Any(up => up.UserId == loggedInUserId))
    .Select(c => new {
        ClientId = c.ClientID,
        ClientName = c.Client + " (" + c.UserProfiles.Count() + ")"
    })

上記をSQL呼び出しに変換するという事実のために、文字列連結を使用する必要がありました.niceを使用しようとすると、String.Format("{0} ({1})", c.Client, c.UserProfiles.Count())それをSQLに変換できないと文句を言うでしょう。

他のオプションは、2 パス クエリを実行し、追加の書式設定を行う前にデータを具体化することです。

db.Clients
    .Where(c => c.UserProfiles.Any(up => up.UserId == loggedInUserId))
    .Select(c => new {
        ClientId = c.ClientID,
        ClientName = c.Client,
        ProfileCount = c.UserProfiles.Count()
    })
    // this forces SQL to execute
    .ToList()
    // now we're working on an in-memory list
    .Select(anon => new {
        anon.ClientId,
        ClientName = String.Format("{0} ({1})", anon.ClientName, anon.ProfileCount)
    })
于 2013-08-19T00:49:35.363 に答える