Ранее (при использовании .net 4.5.2 и EF 6). У меня был общий Get
метод, который принимал ряд включений следующим образом:
public abstract class DataContext : IdentityDbContext<ApplicationUser, ApplicationRole, int>, IDataContext
{
public DataContext(DbContextOptions options)
: base(options)
{
}
// reduced for brevity
public T Get<T>(int id, params Expression<Func<T, object>>[] includes) where T : class, IEntity
{
return this.Set<T>().Include(includes).FirstOrDefault(x => x.Id == id);
}
Я бы тогда позвонил, например;
context.Get<Job>(id,
x => x.Equipment,
x => x.Equipment.Select(y => y.Type));
Чтобы включить Job.Equipment
, а также Job.Equipment.Type
.
Тем не менее, когда я перенес это на ядро asp.net 2. Я попробовал тот же общий подход, но если я пытаюсь включить дочернюю сущность, я получаю следующую ошибку:
Недопустимое выражение свойства 'x => {от Equipment y в x.Equipment select [y] .Type}'. Выражение должно представлять доступ к свойству: 't => t.MyProperty'. Для получения дополнительной информации о включении связанных данных см. http://go.microsoft.com/fwlink/?LinkID=746393.
Кто-нибудь может подсказать, как я могу обойти это, чтобы включить дочерние сущности в мой общий Get<T>
метод с Entity Framework Core 2?
Обновление
При просмотре документов есть дополнительный метод include
include(string navigationPropertyPath)
Я добавил следующий метод;
public T Get<T>(int id, string[] includes) where T : class, IEntity
{
var result = this.Set<T>().AsQueryable();
foreach(var include in includes)
{
result = result.Include(include);
}
return result.FirstOrDefault(x => x.Id == id);
}
Что работает, хотя я не уверен в эффективности здесь?