今天我有一个存储库层,可以访问实体框架数据并将其返回到上层以供使用。我的基本代码如下(SysLog是我的模型类,SYSLOG是从数据库中检索的Entity Framework类。它们有一些区别):
public List<SysLog> List()
{
Entities dbContext = DAODbContext.Instance.EntitiesFactory();
IQueryable<SYSLOG> query = dbContext.SYSLOG;
///
/// Add the obrigatory wheres
///
query = query.Where(record => record.DELETED == "N");
///
/// Add the select order
///
query = query.OrderByDescending(record => record.DATETIME);
///
/// Execute que query
///
List<SYSLOG> dbSysLogList = query.ToList();
///
/// Copy the list to the final format
///
List<SysLog> returnList = new List<SysLog>();
foreach (SYSLOG element in dbSysLogList)
returnList.Add(NormalizedCopyFromDbObj(element));
return returnList;
}
我的问题是我有很多这些功能(例如:To List,To List of date,To List on type,wirh reverse sort order,with some attribute == something)...
我想将其更改为在输入(用于过滤数据)和输出(用于发送数据以供查询)中使用LAMBDA EXPRESSIONS。
我尝试了几种组合,但这些组合似乎都没有效果。我需要帮助才能做到这一点。
感谢。
答案 0 :(得分:3)
您可以尝试修改以下内容以满足您的需求。
public IQueryable<T> Query(Expression<Func<T, bool>> predicate) where T : class
{
Entities dbContext = DAODbContext.Instance.EntitiesFactory();
var dbSet = dbContext.Set<T>();
return dbSet.Where(predicate);
}
这将返回IQueryable
,您可以在Count
,ToList
等上调用其他LINQ扩展方法。
<强>更新强> SysLog特定版本(非通用)
public IQueryable<SYSLOG> Query(Expression<Func<SYSLOG, bool>> predicate)
{
Entities dbContext = DAODbContext.Instance.EntitiesFactory();
var dbSet = dbContext.SYSLOG;
return dbSet.Where(predicate);
}
不确定为什么要声明你的dbContext
并在方法中实例化它。我把它留在那里以便于阅读,但你应该考虑改变它。
答案 1 :(得分:1)
我不完全确定自己了解了之后的情况,但如果您正在寻找创建基于某些过滤条件返回实体列表的单一函数,我通常会执行以下操作。
首先,我创建一个过滤对象,其中包含我可以过滤的所有可能标准:
public class SysLogFilter
{
public string Attribute1 {get;set;}
public string Attribute2 {get;set;}
public DateTime Date {get;set;}
}
然后,将此过滤器传递给您的方法并相应地更改您的查询:
public List<SysLog> List(SysLogFilter filter)
{
Entities dbContext = DAODbContext.Instance.EntitiesFactory();
IQueryable<SYSLOG> query = dbContext.SYSLOG;
if(!String.IsNullOrWhitespace(filter.Attribute1))
query.Where(s => s.Attribute1 == filter.Attribute1);
if(!String.IsNullOrWhitespace(filter.Attribute2))
query.Where(s => s.Attribute2 == filter.Attribute2);
if(filter.Date != null)
query.Where(s => s.DATETIME == filter.Date)
return query.ToList();
}
这是未经测试的,希望它可以为您提供一些工作。