Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;存在显式转换";-林克_C#_Linq_C# 4.0_Compiler Errors_Enumerable - Fatal编程技术网

C# &引用;存在显式转换";-林克

C# &引用;存在显式转换";-林克,c#,linq,c#-4.0,compiler-errors,enumerable,C#,Linq,C# 4.0,Compiler Errors,Enumerable,到目前为止的故事…… 我现在正在学习MVC(4)。我写的应用程序充满了控制器膨胀,所以我决定开始添加存储库/工作单元/服务层等 因此,我决定创建一个通用存储库来封装通用CRUD和记录搜索功能 “别唠叨了,你有什么问题”我听到你说 我想我会创建一个Get方法,该方法将采用两个Lambda参数: 过滤器=选择/取消选择记录逻辑 singleOrDefault=根据参数提供一条记录或默认值 下面是压缩的通用存储库代码,包括get方法: public class GenericRepository&l

到目前为止的故事……

我现在正在学习MVC(4)。我写的应用程序充满了控制器膨胀,所以我决定开始添加存储库/工作单元/服务层等

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

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

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

  • 过滤器=选择/取消选择记录逻辑
  • 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();
        }
    
    问题是:

    A) 我是否使用了正确的LINQ方法?我臃肿的代码中的上述查询是:

    选择RecordStatus不等于X(逻辑删除)和id的分类账客户 等于特定id。

    因为每个id应该只有一条记录(因为它们是唯一的,所以我使用了SingleOrDefault和Where来删除逻辑上删除的任何LedgerCastomer)

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

    问题在于(正如您预期的那样)在线上

    query = query.Where(filter).SingleOrDefault(singleOrDefault);
    
    query
    是一个IQueryable,因此在其上使用
    Where(filter).SingleOrDefault(SingleOrDefault)
    非常合适

    问题在于您试图
    SingleOrDefault
    的结果分配回
    query


    SingleOrDefault
    不返回IQueryable,而只是
    tenty

    表达式
    Where
    SingleOrDefault
    take的一个实例,它们都是同一种过滤器。所以我不明白你为什么要同时使用这两种方法。那么问题是什么呢?是因为您不明白它为什么不能编译(很容易解释),还是因为您不知道如何正确实现该方法(很难解释,因为不清楚您要做什么)?@CodesInChaos和vitaley:首先,感谢您的快速回复,非常感谢。我已经编辑了这个问题。底部是附加信息标题“问题是:”。如果找到匹配项,SingleOrDefault将只返回单个记录,其中。其中(…)将返回项目列表。您正试图将单个元素的tenty保存到IQueryable,这就是它抛出错误的原因。尝试使用var result=…SingleOrDefault返回结果。。。或者返回var result=…其中。。。这可能会解决您的问题。谢谢大家。阅读您的评论后,灯泡发出“ping”声!我认为主要的问题(除了突出的编译器问题!)是我对SingleOrDefault的理解。我用错了地方。我现在将创建2个方法1)“Get”将使用Where(),即一个集合2)“GetById”将使用SingleOrDefault。我正在做的是将您的方法标记为答案,因为您(在上面的注释中)提供了帮助,并且正确地回答了有关编译器错误#slapsmyownface的问题#
     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);
    
    query = query.Where(filter).SingleOrDefault(singleOrDefault);