Include().ThenInclude внутри функции репо: лямбда-выражение, используемое внутри Include, недействительно

У меня есть следующие классы:

public class Transfer
{
    //some more properties
    public virtual ICollection<TransferLineItem> TransferLineItem
}

public class TransferLineItem
{
    public int EquipmentId { get; set; }
    public virtual Equipment Equipment { get; set; }
}

Что я пытаюсь сделать, так это загрузить Transfer со связанной с ним коллекцией TransferLineItem, а также Equipment, связанной с этим TransferLineItem.

Я изменил свою функцию репо следующим образом:

public virtual async Task<TEntity> GetOneAsync<TEntity>(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> includes = null)
        where TEntity : class
    {
        return await GetQueryable(filter: filter, includes: includes).SingleOrDefaultAsync();
    }

protected virtual IQueryable<TEntity> GetQueryable<TEntity>(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        int? skip = null,
        int? take = null,
        Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> includes = null)
        where TEntity : class
    {
        IQueryable<TEntity> query = Context.Set<TEntity>();

        if (includes != null)
        {
            query = includes(query); //includes.Aggregate(query, (current, include) => current.Include(include)).AsNoTracking();
        }

        if (filter != null)
        {
            query = query.Where(filter);
        }

        if (orderBy != null)
        {
            query = orderBy(query);
        }

        if (skip.HasValue)
        {
            query = query.Skip(skip.Value);
        }

        if (take.HasValue)
        {
            query = query.Take(take.Value);
        }

        return query;
    }

Я попытался вызвать вышеуказанную функцию, как показано ниже, с использованием ThenInclude().

var primaryTransfer = await _repo.GetOneAsync<Transfer>(
                filter: t => t.TransferId == transferId,
                includes: source => source
                    .Include(t => t.TransferLink)
                    .Include(t => t.TransferLineItem)
                    .ThenInclude(t => t.Select(e => e.Equipment))
                    .Include(t => t.TransferScanItem)
                    .Include(t => t.TransferAggregate)
                    .Include(t => t.CompanyTransferType));

Думал, что это сработает, но получаю ошибку:

Лямбда-выражение, используемое внутри Include, недопустимо.

Как включить Equipment?


person monstertjie_za    schedule 22.11.2019    source источник
comment
Я думаю, это будет .Include(t => t.TransferLineItem).ThenInclude(tli=>tli.Equipment)   -  person Robert McKee    schedule 22.11.2019
comment
в моем случае tli по-прежнему имеет тип ICollection‹TransferLineItem›   -  person monstertjie_za    schedule 22.11.2019
comment
Хорошо, подождите, мой Intellisense на .ThenInclude() не работает, я не вижу оборудование или какие-либо свойства в раскрывающемся списке, который предоставляет intellisense, и он показывает, что мой тип — ICollection‹TransferLineItem›, но ввод свойств без помощи intellisense делает не дает мне ошибок времени компиляции, поэтому он принял это   -  person monstertjie_za    schedule 22.11.2019
comment
ЕСЛИ бы вы отказались от репозитория, ваша жизнь была бы намного проще, а ваш код стал бы намного удобнее в сопровождении и использовании.   -  person TheGeneral    schedule 22.11.2019
comment
@TheGeneral Не могли бы вы подтвердить это причинами? Этот репозиторий кажется подходящим, но я хотел бы услышать лучшие предложения   -  person monstertjie_za    schedule 22.11.2019