4

私はさまざまな種類の EF エンティティを持っていますが、そのすべてに「Employee」というナビゲーション プロパティがあります。レポートを生成するとき、ユーザーはさまざまな従業員のプロパティ (コスト センター、性別など) に従ってレポートをフィルター処理するオプションを利用できます。

現在、各クエリを個別にフィルタリングしています。次に例を示します。

var courses = context.Courses
              .Where(c => c.Employee.CostCenterID == ccID
                     && c.Employee.Rank == rankID
                     ....
                    )
                    .ToList();

実際のフィルタ コードはもっと長くなりますが、これはヒントにすぎません。とにかく、従業員によって結果をフィルタリングするための汎用メソッドを作成する方法はありますか? このフィルタ メソッドに提供するすべてのエンティティには、Employeeナビゲーション プロパティがあります。orを指定するだけで、フィルタリングされたIQueryable<entity>orObjectSet<entity>を取得できIQueryable<entity>ますObjectSet<entity>

どうやってするか?

4

2 に答える 2

3

インターフェイスの実装を避けたい場合:

public Expression<Func<TEntity, bool>> EmployeeFilterDelegateExp<TEntity>( 
    int costCenterId, 
    int rankId )
{
    var parm = Expression.Parameter( typeof( TEntity ), "entity" );
    var employeeProperty = Expression.Property( parm, "Employee" );

    return ( Expression<Func<TEntity, bool>> )Expression.Lambda(
        Expression.AndAlso(
            Expression.Equal( Expression.Property( employeeProperty, "CostCenterID" ), 
                Expression.Constant( costCenterId ) ),
            Expression.Equal( Expression.Property( employeeProperty, "Rank" ), 
                Expression.Constant( rankId ) ) ),
        parm );
}

使用法:

var courses = context.Courses
    .Where( EmployeeFilterDelegateExp<Course>( ccID, rankID ) )
    .ToList();
于 2014-01-29T19:29:14.330 に答える