1

我有一个用户表、一个角色表和一个交叉引用表 Users_Roles,其中包含以下列:

User_ID Role_ID Beamline_ID Facility_ID Laboratory_ID

Beamline_ID、Facility_ID、Laboratory_ID 仅根据 Role_ID 填写。如果某人的 Role_ID 为 2(“实验室管理员”),那么他们将在 Laboratory_ID 中有一个条目。

我试图弄清楚如何获取此表中特定行的 Laboratory_ID。例如,我知道我有 User_ID = 1。我想获取 User_ID = 1 和 Role_ID = 2 的 Laboratory_ID(“实验室管理员”)。

这在处理 SQL 时显然很简单,但我是 Entity Framework 的新手,我正在尝试用 Entities 来做这件事,但遇到了一些麻烦。我正在使用 MVC,所以在我的控制器中我已经这样做了:

User user = new User();
user.GetUser(User.Identity.Name);
var labID = user.Users_Roles.Where(r => r.Role_ID == 2);

当 Role = Lab Admin 时,这应该让我获得该用户的“行”,但我现在不知道如何获取 Labortory_ID 列。我想也许它会是:

var labID = user.Users_Roles.Where(r => r.Role_ID == 2).Select(l => l.Laboratory_ID);

但这是不正确的。任何帮助将不胜感激。

编辑:我使用的是数据库优先方法,我使用的是 DBContext。所以通常我会像这样访问上下文:

var context = new PASSEntities();
4

1 回答 1

1

至于为什么您已经尝试过的代码不起作用,乍一看我认为您只需将 a.Single()添加到最后:

var labID = user.Users_Roles.Where(r => r.Role_ID == 2)
                            .Select(l => l.Laboratory_ID)
                            .Single();

Select()返回一个序列,看起来你想要一个值,所以我认为这可能是你遇到问题的原因。 Single()如果不完全是一个结果,将引发异常,这听起来适合您的表结构,但First()如果您不关心强制执行它,也会抛出异常。

但是对于这种事情,您可能还考虑仅使用您的 手动查询DbContext,而不是尝试单独加载实体然后遍历它们的导航属性——这会导致比您可能需要的更多本地搜索,并且取决于在这种情况下,可能会对您的上下文和数据库执行更多/更大的查询。

这是您可以使用的示例 LINQ 查询(您可能需要调整表的名称等):

 var labID = (from ur in context.Users_Roles
              where ur.User_ID == 1 && ur.Role_ID == 2
              select ur.Laboratory_ID).Single();

当您执行该语句时,它将被翻译成与此等效的 SQL:

SELECT TOP 1 Laboratory_ID FROM Users_Roles WHERE User_ID = 1 AND Role_ID = 2

......所以它非常有效。(实际上,如果 User_ID 和 Role_ID 构成了 Users_Roles 表的主键,并且之前已经加载了该记录,我认为它只会返回缓存的副本,根本不需要查询数据库。)

不过,这是一个非常简单的查询;很有可能,您最终会希望根据用户或角色的属性进行查询,而不是仅仅搜索您事先知道的硬编码 ID。在这种情况下,您可以将查询调整为如下所示:

var labID = (from u in context.Users
             join ur in context.Users_Roles on u.User_ID equals ur.User_ID
             join r in context.Roles on ur.Role_ID equals r.Role_ID
             where u.UserName == "John Smith" && r.RoleName == "Lab Admin"
             select ur.Laboratory_ID).Single();

正如您可能知道的那样,这将返回角色 Lab Admin 下用户 John Smith 的 Lab ID。

这有任何意义吗?LINQ 语法可能需要一点时间来适应。

于 2013-05-14T19:10:48.287 回答