无法找到单个 属性 并在没有 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
子句结合使用,以确保查询是可预测的。
我有我想要访问的对象的关系数据属性:
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
子句结合使用,以确保查询是可预测的。