迄今为止的故事。。。。
我现在正在学习MVC(4)。我已经编写了我的应用程序,其中包含
控制器印迹
所以我决定开始添加存储库/UnitOfWork/服务层等。
因此,我决定创建一个通用存储库来封装通用CRUD和记录搜索功能。
“别唠叨了,你有什么问题”我听到你说
我想我会创造一个
收到
方法,该方法将采用两个Lambda参数:
-
filter=选择/取消选择记录逻辑
-
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) 关于编译器错误的帮助会很有帮助。