使用导航属性或进行单独的查询

问题描述 投票:0回答:1

假设我有两个实体。 (我以这些实体为例,在实际情况下它们可能有更多不同的字段)

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int OrganizationId { get; set; }
    public Organization Organization { get; set; }
}
public class Organization
{
    public int Id { get; set; }
    public bool IsActive { get; set; }
    public User[] Users { get; set; }
}

我想获取组织处于活动状态的用户的ID。

选项 1:

var userIds = await db.Users
    .Where(x => x.Organization.IsActive)
    .Select(x => x.Id)
    .ToListAsync();

选项2:

var organizationIds = await db.Organizations
    .Where(x => x.IsActive)
    .Select(x => x.Id)
    .ToListAsync();

var userIds = await db.Users
    .Where(x => organizationIds.Contains(x.OrganizationId))
    .Select(x => x.Id)
    .ToListAsync();

可能是一个非常平庸的问题,但我总是怀疑在这种情况下我应该使用什么。选项 1 或选项 2。还是取决于,是否取决于什么以及要注意什么?

c# entity-framework
1个回答
0
投票

我认为这些本质上是一样的。当我们编写选项 1 时,在幕后,该查询将转换为 SQL 连接查询,而底层的数据库引擎会将普通连接查询转换为分离查询。

当我们编写选项 2 时,与选项 1 相同,这将作为每个表的 2 个独立 SQL 查询执行。

所以我认为,基本上,这两个 LINQ 查询将在数据库层的幕后以相同的方式执行。

© www.soinside.com 2019 - 2024. All rights reserved.