5

以下の関数に動的ラムダ式を渡したいのですが、式オブジェクトで .Take() または .OrderByDescending() を定義する方法がわかりません。以下の関数を呼び出したい場合は、これを実行できるようにしたいと考えています。

dbprovider.Query = (x => x.ConfigurationReference == "172.16.59.175")
                   .Take(100)
                   .OrderByDescending(x.Date)
FindEntities(db, dbprovider.Query)

しかし、できません (この構文は無効です)。何か案は?

public static List<T> FindEntities<T>(TrackingDataContext dataContext, System.Linq.Expressions.Expression<Func<T, bool>> find) where T : class
{
    try
    {
        var val = dataContext.GetTable<T>().Where(find).ToList<T>();
        return val;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
4

1 に答える 1

6

パラメータのタイプは次のとおりです。

System.Linq.Expressions.Expression<Func<T, bool>> find

つまり、述語 ("where" 句) を使用でき、述語のみを使用できます。したがって、そこに渡すことができる唯一のビットはフィルターです。

x => x.ConfigurationReference == "172.16.59.175"

必要なことを行うには、残りのコードを に追加して、次のようにする必要がありますFindEntities

var val = dataContext.GetTable<T>().Where(find)
              .OrderByDescending(x => x.Date).Take(100).ToList<T>();

(Take実際にはのにある必要があることにも注意してくださいOrderByDescending)

それを行う1つの方法は次のとおりです。

public static List<T> FindEntities<T>(TrackingDataContext dataContext,
    System.Linq.Expressions.Expression<Func<T, bool>> find,
    Func<IQueryable<T>, IQueryable<T>> additonalProcessing = null
) where T : class
{
    var query = dataContext.GetTable<T>().Where(find);
    if(additonalProcessing != null) query = additonalProcessing(query);
    return query.ToList<T>();
}

そして呼び出します:

var data = FindEntities(db, x => x.ConfigurationReference == "172.16.58.175",
    q => q.OrderByDescending(x => x.Date).Take(100));

ただし、率直に言って、これが何を意味するのかはわかりません...呼び出し元は、まったく使用せずに、ローカルでより便利にすべてのことを行うことができますFindEntities。ただ:

var data = db.GetTable<T>()
             .Where(x => x.ConfigurationReference == "172.16.58.175")
             .OrderByDescending(x => x.Date).Take(100).ToList(); 

あるいは:

var data = db.SomeTable
             .Where(x => x.ConfigurationReference == "172.16.58.175")
             .OrderByDescending(x => x.Date).Take(100).ToList();

あるいは単に:

var data = (from row in db.SomeTable
            where row.ConfigurationReference == "172.16.58.175"
            orderby row.Date descending
            select row).Take(100).ToList();
于 2012-12-03T06:17:15.510 に答える