3

タイトルが良くないのは承知しています。

すべてのエンティティ関数を含むサービスがあります。

私のサービスには、この構造を持つ関数があります

IList<T> GetAllPaged<TKey>(
    List<Expression<Func<T, bool>>> predicate, 
    Expression<Func<T, TKey>> orderKeySelector
);

この関数は、1 つのエンティティからデータを取得して並べ替えます。

今はもっとやりたい。

最初に 1 つのエンティティから選択し、それを順番にグループ化し、最後にグループ化されたアイテムから新しいアイテムを選択します。

このようなもの:

IList<TReturn> GetAllPaged<TResult, TKey, TGroup, TReturn>(
    List<Expression<Func<T, bool>>> predicate, 
    Expression<Func<T, TResult>> firstSelector, 
    Expression<Func<TResult, TKey>> orderSelector, 
    Func<TResult, TGroup> groupSelector, 
    Func<IGrouping<TGroup, TResult>, TReturn> selector
);

それは可能ですか?

4

2 に答える 2

1

たぶん、エンティティで何かを行う汎用関数を渡すことができますか? 式が楽しいことはわかっていますが、最終結果が単純なものよりも優れているかどうかを常に検討する必要があります。

このようなもの:

TResult Query<TEntity, TResult>(Func<IQueryable<TEntity>, TResult> queryFunction)

Entity Framework の実装:

using(var context = new SomeContext())
{
    return queryFunction(context.Set<TEntity>());
}

使用法:

var listOfCars = carService.Query(cars => cars
    .Select(c => new { Id = c.Id, Name = c.Name })  // c stands for car
    .GroupBy(a => a.Name) // a stands for "anonymous object"
    .OrderBy( /* order your group in some fashion */)
    .ToList()
);

このすべてのロジックを個別のパラメーターに入れると、匿名オブジェクトを使用できなくなり、多くのサービス メソッドを記述しなければならなくなります。

于 2013-11-12T09:10:21.260 に答える