【问题标题】:ASP.NET MVC application users linq to join to other tablesASP.NET MVC 应用程序用户 linq 加入其他表
【发布时间】:2017-09-22 07:30:12
【问题描述】:

我使用默认的 ASP.NET MVC 5 用户身份在我的数据库中存储和管理用户。

我还有其他将引用用户表的数据库表。

我面临的问题是如何在查询具有外键(userid)的某个表时提取用户详细信息。

根据我在网上看到的情况,我无法直接查询 users 表(“不是最佳实践”)。

所以我必须使用ApplicationDbContext 来获取用户列表:

var userContext = new ApplicationDbContext();
var db_users = userContext.Users.Select(x => new UserSearchResult() 
{
  ApplicationUserId = x.Id,
  Email = x.Email,
  Username = x.UserName,
  Fullname = x.FullName
});

那么我的 linq 查询将是例如:

var query = (from dep in Dbcontext.Departments
             from usr in db_users.Where(x => x.ApplicationUserId == dep.HodUserId).DefaultIfEmpty()
             join cat in Dbcontext.Categories on dep.CategoryId equals cat.CategoryId
             select new DepartmentSearchResult() 
             {
               DepartmentId = dep.DepartmentId,
               DepartmentName = dep.DepartmentName,
               HodName = usr.Fullname,
               CategoryName = cat.CategoryName
             });

但是,由于 SQL 不知道 db_users,因此上述方法不起作用。

有没有办法解决这个问题?

【问题讨论】:

  • 如果您使用HodUserId 对其主表进行FK 引用,则直接在查询中引用users 表没有问题。
  • @sajal,用户表不是我的 dbcontext 的一部分。那么是不是就像在 dbcontext 中添加一个 dbset 一样简单。还是我需要编写其他代码?

标签: asp.net-mvc linq asp.net-identity


【解决方案1】:

您可以在使用 UserId 作为外键的模型中添加用户的导航属性。查询该特定项目时包括用户详细信息。

在你的部门模型中说

public class Department
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ApplicationUser User { get; set; } //Navigation Property
        public string UserId { get; set; }  //Foreign Key
    }

当您在任何操作中查询部门信息时

var _context = new ApplicationDbContext();
var department = _context.Departments.Include(c => c.User).FirstOrDefault();

在这里,我使用 FirstOrDefault() 从 db 获取单个(确切地说是第一个)项目。您可以根据需要使用任何适当的方法。

现在在部门中,您只需通过department.User.FullName 或您需要的用户的任何属性即可访问用户信息

【讨论】:

  • var context = new ApplicationDbContext(); 我的部门不属于 applicationDbContext 实例。
  • 我在试图弄清楚如何让它工作时遇到了问题,只是为了意识到,您的解决方案正在使用一个 dbcontext (applicationcontext),而我的应用程序正在使用 dbcontextapplicationcontext .一旦我摆脱了dbcontext 并将我所有的dbsets 移动到applicationcontext 你的解决方案就起作用了
  • 你没有在问题中提到它,我也没有注意到你使用了两个 dbcontexts。对于那个很抱歉。我想知道为什么您的应用程序中需要多个 dbcontexts?
【解决方案2】:

您不应该这样做 - 您可以将您感兴趣的用户具体化到一个集合并加入到这个集合中(但随后将在内存中完成),或者您可以将两个表放在一个数据上下文中并正常加入。您不应该跨数据上下文连接,因为它们在查询时可能都具有不一致的数据库视图...

【讨论】:

  • 感谢您提供的信息。在 dbcontext 中保留另一个用户表是否是个好主意,该表将包含全名等信息,然后改为查询该表
猜你喜欢
  • 2012-09-25
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2011-05-31
  • 2011-01-06
  • 2018-04-29
  • 1970-01-01
相关资源
最近更新 更多