使用lambda表达式查询和转换数据

时间:2013-09-13 23:58:02

标签: c# linq entity-framework lambda

今天我有一个存储库层,可以访问实体框架数据并将其返回到上层以供使用。我的基本代码如下(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。

我尝试了几种组合,但这些组合似乎都没有效果。我需要帮助才能做到这一点。

感谢。

2 个答案:

答案 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,您可以在CountToList等上调用其他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();
}

这是未经测试的,希望它可以为您提供一些工作。