故事......
我正在学习MVC(4)。我写了我的应用程序,其中充满了 Controller Bloat 所以我决定开始添加Repositories / UnitOfWork / Service Layers等。
所以我决定创建一个通用存储库来封装一般的CRUD和记录搜索功能。
“停止喋喋不休,你的问题是什么”我听到你说
我想我会创建一个获取方法,该方法将采用两个Lambda参数:
以下是精简的通用存储库代码,包括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)帮助编译错误会有所帮助。
答案 0 :(得分:2)
问题在于(如你所料)在线上;
query = query.Where(filter).SingleOrDefault(singleOrDefault);
query
是一个IQueryable,因此使用Where(filter).SingleOrDefault(singleOrDefault)
就可以了。
问题在于您尝试将SingleOrDefault
的结果分配回query
。
SingleOrDefault
不返回IQueryable,而只返回TEntity
的单个实例。