“存在显式转换” - LINQ

时间:2012-09-23 11:38:55

标签: c# linq c#-4.0 compiler-errors enumerable

故事......

我正在学习MVC(4)。我写了我的应用程序,其中充满了 Controller Bloat 所以我决定开始添加Repositories / UnitOfWork / Service Layers等。

所以我决定创建一个通用存储库来封装一般的CRUD和记录搜索功能。

“停止喋喋不休,你的问题是什么”我听到你说

我想我会创建一个获取方法,该方法将采用两个Lambda参数:

  1. filter =选择/取消选择记录逻辑
  2. singleOrDefault =根据参数提供一条记录或默认值。
  3. 以下是精简的通用存储库代码,包括get方法:

     public class GenericRepository<TEntity> :
        IRepository<TEntity> where TEntity : class 
    {
    
        internal AccountsContext context;
        internal DbSet<TEntity> dbSet;
    
    
        /// <summary>
        /// Default Constructor.
        /// </summary>
        /// <param name="context"></param>
        public GenericRepository(AccountsContext context)
        {
            this.context = context;
            this.dbSet = context.Set<TEntity>();
        }
    
    
        public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter, 
            Expression<Func<TEntity, bool>> singleOrDefault)
        {
            IQueryable<TEntity> query = dbSet;
    
            if (filter != null && singleOrDefault == null)
            {
                query = query.Where(filter);
            }
    
            if (filter != null && singleOrDefault != null)
            {
                query = query.Where(filter)
                             .SingleOrDefault(singleOrDefault);
            }
    
    
            return query.ToList();
        }
    

    当我尝试构建它时,现在使用以下编译器:

    错误1无法将类型'TEntity'隐式转换为'System.Linq.IQueryable'。存在显式转换(您是否缺少演员?)G:\ Accountable \ Accountable \ DataAccessLayer \ GenericRepository.cs 90 30负责

    错误在于 .SingleOrDefault(singleOrDefault)行。

    为方便起见,我使用以下方法提供了扩展方法签名:

        public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static TSource SingleOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
    

    我一直盯着这个试图解决它的问题,任何帮助都会非常感激。

    FYI

    在我臃肿的代码中,我的控制器中有以下类型的代码,我想用我的存储库方法替换,这就是我想要复制的。

     LedgerCustomer LedgerCustomer = db.LedgerCustomers.Where(l => l.RecordStatus != "X").SingleOrDefault(l => l.id == id);
    
     CurrencyType currencyType = db.CurrencyTypes.Where(c => c.RecordStatus != "X")
                    .SingleOrDefault(c => c.id == LedgerCustomer.CurrencyTypeId);
    

    问题是:

    A)我使用正确的LINQ方法吗?来自我膨胀代码的上述查询是:

    选择Ledger客户,其中RecordStatus不等于X(逻辑删除)和id 等于特定的身份。

    因为LedgerCustomer PER id应该只有一条记录(因为它们是唯一的,我使用了SingleOrDefault以及在哪里取消选择逻辑删除的任何LedgerCustomer。

    B)帮助编译错误会有所帮助。

1 个答案:

答案 0 :(得分:2)

问题在于(如你所料)在线上;

query = query.Where(filter).SingleOrDefault(singleOrDefault);

query是一个IQueryable,因此使用Where(filter).SingleOrDefault(singleOrDefault)就可以了。

问题在于您尝试SingleOrDefault的结果分配回query
SingleOrDefault不返回IQueryable,而只返回TEntity的单个实例。