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

UPDATE 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 に答える