C# &引用;存在显式转换";-林克
到目前为止的故事…… 我现在正在学习MVC(4)。我写的应用程序充满了控制器膨胀,所以我决定开始添加存储库/工作单元/服务层等 因此,我决定创建一个通用存储库来封装通用CRUD和记录搜索功能 “别唠叨了,你有什么问题”我听到你说 我想我会创建一个Get方法,该方法将采用两个Lambda参数: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
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);