代码之家  ›  专栏  ›  技术社区  ›  garfbradaz Vivek

“存在显式转换”-LINQ

  •  1
  • garfbradaz Vivek  · 技术社区  · 12 年前

    迄今为止的故事。。。。

    我现在正在学习MVC(4)。我已经编写了我的应用程序,其中包含 控制器印迹 所以我决定开始添加存储库/UnitOfWork/服务层等。

    因此,我决定创建一个通用存储库来封装通用CRUD和记录搜索功能。

    “别唠叨了,你有什么问题”我听到你说

    我想我会创造一个 收到 方法,该方法将采用两个Lambda参数:

    1. filter=选择/取消选择记录逻辑
    2. singleOrDefault=根据参数提供一个记录或一个默认值。

    这是浓缩的 通用存储库 包括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 Accountable

    错误在于 .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);
    

    我已经盯着这个问题看了很长时间,试图解决它,任何帮助都将不胜感激。

    财政年度

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

     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方法?以上来自我的臃肿代码的查询是:

    选择记录状态不等于X(逻辑删除)和id的分类帐客户 等于一个特定的id。

    因为LedgerCustomer PER id应该只有一条记录(因为这些记录是唯一的,所以我使用了SingleOrDefault和Where来delselect逻辑上删除的任何LedgerClient。

    B) 关于编译器错误的帮助会很有帮助。

    1 回复  |  直到 12 年前
        1
  •  2
  •   Joachim Isaksson    12 年前

    问题在于(正如你所预料的)线路上;

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

    query 是可查询的,因此使用 Where(filter).SingleOrDefault(singleOrDefault) 在上面还可以。

    问题在于你试图 指定的结果 SingleOrDefault 返回到 查询
    单个或默认 不返回IQueryable,而是仅返回的一个实例 TEntity