如何访问相关数据建立由EF(How to access Related Data built By

2019-10-18 12:07发布

类似于简单的会员UserProfilesRoles在表UserInRoles

我创建之间的关系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; } public virtual ICollection<dbClient> Clients { get; set; } public virtual ICollection<dbClient> Clients { get; set; }和我的Clients有一个public virtual ICollection<UserProfiles> UserProfiles { get; set; } public virtual ICollection<UserProfiles> UserProfiles { get; set; }

  • 如果您需要看到模型让我知道我可以张贴

在模型和视图我想

  1. 显示所有客户端(不同),并显示有多少用户访问该客户端
  2. 创建一个视图,只显示在客户端用户当前登录被允许查看。

我想这是因为我的访问模式Clients.ClientID的属性一样容易,我一直在努力的事情像Clients.ClientID.select(U => u.UserId ==客户端ID),但我知道得更清楚,知道它现在和将来不行。

我的其他的想法是创建具有CliendID在它的模型和用户名(如它创建的表),所以我可以用我的控制器联接,以找到正确的价值观?


到底是什么我试图accomlish是填充KendoUI CascadingDropDownList这条线在我GetCascadeClients JsonResult

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

我的问题是,当我在我的控制,我怎么访问此表由实体框架构建?

编辑:

解决方案: 查询两个答案拼凑起来的

  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);

Answer 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调用,我不得不使用字符串连接,因为如果你试图用一个漂亮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)
    })


Answer 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与客户一起,使您可以使用该表进行过滤,记录计数等..那。凡条款可能需要一些实际的工作,但是这应该是一个良好的开端。



文章来源: How to access Related Data built By the EF