Как использовать Predicate с универсальным репозиторием - PullRequest
0 голосов
/ 14 июня 2019

Я следую этому уроку https://www.codeproject.com/Articles/990492/RESTful-Day-sharp-Enterprise-Level-Application?msg=5635950#xx5635950xx Он очень хорошо объясняет простые вещи, но мне, как новичку, сложно понять реализацию расширенной функции универсального репозитория

    public virtual IEnumerable<TEntity> GetMany(Func<TEntity, bool> 
    where)
    {
        return DbSet.Where(where).ToList();
    }

    /// <summary>
    /// generic method to get many record on the basis of a condition but 
    query able.
    /// </summary>
    /// <param name="where"></param>
    /// <returns></returns>
    public virtual IQueryable<TEntity> GetManyQueryable(Func<TEntity, 
    bool> where)
    {
        return DbSet.Where(where).AsQueryable();
    }

    /// <summary>
    /// generic get method , fetches data for the entities on the basis of 
        condition.
    /// </summary>
    /// <param name="where"></param>
    /// <returns></returns>
    public TEntity Get(Func<TEntity, Boolean> where)
    {
        return DbSet.Where(where).FirstOrDefault<TEntity>();
    }

Я реализую это в моем сервисном файле

      public GEN_TransactionTypeSetup GetTransactionIdByTableName(string 
       tableName)
        {
        IEnumerable<GEN_TransactionTypeSetup> list = 
        _unitOfWorks.TransactionType_Repository.GetMany(p => 
         p.Master_TableName = tableName);
        return list.ToList();
       }

и я получаю следующую ошибку

  • Невозможно неявно преобразовать тип 'string' в 'bool'
  • Невозможно преобразовать лямбда-выражение в тип делегата. System.Func, потому что некоторые из возвращаемых типов в блоке неявно преобразуются в тип возврата делегата
  • Невозможно неявно преобразовать тип 'System.Collections.Generic.List' в DataModels.GEN_TransactionTypeSetup

1 Ответ

0 голосов
/ 14 июня 2019

Вы сможете использовать предикат в функции типа TEntity в своей реализации.

Допустим, ваш TEntity равен Person (GenericRepository<Person>), а ваш Personимеет свойство Age, которое является int.

Затем вы сможете сказать:

IEnumerable<Person> result = repository.GetMany(p => p.Age > 18);

Как видите, этот (универсальный) метод возвращает IEnumerable<TEntity>, что означает, что вы можете применять (и связывать) другие методы Linq к своему результату.

Также обратите внимание, что ToList() в

return DbSet.Where(where).ToList();

является излишним и, в больших наборах результатов, можетсоздают значительные накладные расходы, потому что метод возвращает IEnumerable<TEntity>, и так уже делает Linq .Where().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...