【问题标题】:How to write a generic entity getter method including all the navigation properties? [duplicate]如何编写一个包含所有导航属性的通用实体 getter 方法? [复制]
【发布时间】:2020-06-20 00:50:55
【问题描述】:

我编写了一个通用的 repo 方法,包括以下所有导航属性:

    public async Task<IEnumerable<T>> GetAllWhereAsync(Expression<Func<T, bool>> expression, bool include = false)
    {
        if (include)
            foreach (var name in _db.Model.FindEntityType(typeof(T)).GetNavigations().Select(e => e.Name))
                _db.Set<T>().Include(name).Load();

        return await _db.Set<T>().AsNoTracking().Where(expression).ToListAsync();
    }

但是,当我调用此方法时,生成的实体不包含其导航属性。我该怎么办?

【问题讨论】:

  • Include() 调用需要链接在一起并且在return 中使用相同的IQueryable&lt;T&gt;。 LINQ 通常是不可变的,甚至会从似乎修改查询的事物中返回新的查询对象。

标签: c# entity-framework-core


【解决方案1】:

看看这个修改是否编译,我现在离编译器不远,所以不能确定。

public async Task<IEnumerable<T>> GetAllWhereAsync(Expression<Func<T, bool>> expression, bool include = false)
{
    var query = _db.Set<T>();
    if (include)
        foreach (var name in _db.Model.FindEntityType(typeof(T)).GetNavigations().Select(e => e.Name))
            query = query.Include(name);

    return await query.AsNoTracking().Where(expression).ToListAsync();
}

【讨论】:

  • 这里的查询实际上是一个 DbSet,所以我得到无法将类型 'System.Linq.IQueryable' 隐式转换为 'Microsoft.EntityFrameworkCore.DbSet' 编辑: 变种查询 = _db.Set().AsQueryable();作品。谢谢。
猜你喜欢
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多