无法找到单个 属性 并在没有 IQueryable 所有属性的情况下导航相关数据

Can't find single property and navigate related data without IQueryable all properties

我有我想要访问的对象的关系数据属性:

public class Person
{
   public ICollection<Address> Addresses { get; private set; } = new Collection<Address>();
   ...
}

public class Address
{
   ...
   public int PersonId { get; set; }
   public Person Person { get; set; }
   ...
}

我发现在没有延迟加载(和引入代理等)的情况下遍历甚至练习此导航 属性 的唯一方法是预先加载它:

var entityList = await _context.Persons.Where(p => p.Id == request.PersonId)
    .Include(p => p.Addresses)
    .ToListAsync();

这很不方便,因为现在我总是必须执行以下操作才能干净地访问 class(及其属性):

var person = entityList.FirstOrDefault();

Microsoft docs中的每个示例:

var blogs = context.Blogs
    .Include(blog => blog.Posts)
    .ToList();

他们在加载相关数据之前抓取每个博客实体,而不是单个实体。

我无法显式加载,因为它依赖于我无法通过注入的 DbContext 接口访问的 public virtual EntityEntry<TEntity> Entry<TEntity>(TEntity entity)

有没有没有 IQueryable where 表达式的更简洁的方法?我只想找到我的单个实体并浏览其属性。

根据你的问题,我认为你混淆了 eager/lazy 加载与 LINQ 执行方法。对于这样的事情:

var entityList = await _context.Persons.Where(p => p.Id == request.PersonId)
    .Include(p => p.Addresses)
    .ToListAsync();
var person = entityList.FirstOrDefault();

您真的只想要 1 个人及其地址,然后使用:

var person = await _context.Persons
    .Include(p => p.Addresses)
    .SingleOrDefaultAsync(p => p.Id == request.PersonId);
    

这将获取此人及其相关地址。如果您希望始终有记录,最好使用 SingleAsync 而不是“OrDefault”变体。 (如果发送了无效的 PersonId 则抛出异常)

Include 确定预先加载。 ToList 只是告诉 Linq 期待可能的多个匹配行。您可能遇到问题的地方是尝试在 DbSet 上使用 Find 并且它对 Addresses 集合求助于延迟加载。

First 方法只能与 OrderBy 子句结合使用,以确保查询是可预测的。