如何在通用存储库中使用谓词

时间:2019-06-14 09:18:37

标签: database entity-framework asp.net-web-api

我正在关注本教程 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'
  • 无法将lambda表达式转换为委托类型 'System.Func',因为一些 块中的返回类型不能隐式转换为 委托返回类型
  • 无法隐式转换类型 'System.Collections.Generic.List' 到“ DataModels.GEN_TransactionTypeSetup”

1 个答案:

答案 0 :(得分:0)

您将可以在实现中使用TEntity类型的函数中的谓词。

假设您的TEntityPersonGenericRepository<Person>),而您的Person具有属性Age,即int。 / p>

然后您可以说:

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

如您所见,此(通用)方法返回一个IEnumerable<TEntity>,这意味着您可以将其他Linq方法应用于(并链接到)结果。

还请注意,{p>中的ToList()

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

是多余的,并且在较大的结果集中可能会产生大量开销,因为该方法返回IEnumerable<TEntity>,而Linq .Where()也已经这样做了。