1

类似于表中的简单成员UserProfiles资格RolesUserInRoles

我已经使用此代码在表中创建了与之间UserProfiles的关系ClientsUserInClients

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 的属性一样简单,我一直在尝试诸如 Clients.ClientID.select(u=>u.UserId == clientid) 之类的东西,但我知道得更好,并且知道它不会而且会不行。

我的其他想法是创建一个包含 CliendID 和 UserID 的模型(就像它创建的表一样),这样我就可以在我的控制器中使用连接来找到正确的值?


最后我想要完成的是KendoUI CascadingDropDownList在我的GetCascadeClients JsonResult

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

我的问题是,当我在我的控制器中时,我如何访问这个由实体框架构建的表?

编辑:

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 与客户端一起提取,允许您使用该表进行过滤、记录计数等…….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() + ")"
    })

Due to the fact that it will convert the above into SQL calls, I had to use string concatenation, as if you try to use a nice String.Format("{0} ({1})", c.Client, c.UserProfiles.Count()) it will complain about being unable to translate that to SQL.

The other options is to do a 2-pass query, materializing the data before doing extra formatting:

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 回答