假设我有两个实体。 (我以这些实体为例,在实际情况下它们可能有更多不同的字段)
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。还是取决于,是否取决于什么以及要注意什么?
我认为这些本质上是一样的。当我们编写选项 1 时,在幕后,该查询将转换为 SQL 连接查询,而底层的数据库引擎会将普通连接查询转换为分离查询。
当我们编写选项 2 时,与选项 1 相同,这将作为每个表的 2 个独立 SQL 查询执行。
所以我认为,基本上,这两个 LINQ 查询将在数据库层的幕后以相同的方式执行。