2

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

我的问题是我有很多这样的功能(例如:列出,基于日期列出,基于类型列出,反向排序顺序,带有一些属性==某些东西)......

我想将其更改为在输入(过滤数据)和输出(发送可查询的数据)上使用 LAMBDA EXPRESSIONS。

我尝试了几种组合,但这些组合似乎都不起作用。我需要帮助才能做到这一点。

谢谢。

4

2 回答 2

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上调用其他 LINQ 扩展方法的方法。CountToList

更新 SysLog 特定版本(非通用)

public IQueryable<SYSLOG> Query(Expression<Func<SYSLOG, bool>> predicate)
{
    Entities dbContext = DAODbContext.Instance.EntitiesFactory();

    var dbSet = dbContext.SYSLOG;

    return dbSet.Where(predicate);
}

不知道为什么要dbContext在方法中声明并实例化它。我把它留在那里是为了更容易阅读,但你应该考虑改变它。

于 2013-09-14T00:16:24.863 回答
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();
}

这是未经测试的,希望它能给你一些工作。

于 2013-09-14T00:09:29.253 回答