0

.Net Framework 4、mvc 3、およびエンティティ フレームワーク (最新の安定版) を使用しています。

インデックス ページで、各列をフィルターできるようにしたいと考えています。フィルター値は、distinct() メソッドを使用して LINQ によって列ごとに取得されます。各列のこれらの値を取得するメソッドを再利用する良い方法が見つかりませんでした.それらは基本的に同じです.それらを区別する唯一のものは使用される列名です.

public List<string> GetLevels()
{
    return _db.Logs.Select(l => l.Level).Distinct().ToList();
}

public List<string> GetOrders()
{
    return _db.Logs.Select(l => l.Order).Distinct().ToList();
}

データを取得する列名をラムダ式に挿入するにはどうすればよいですか? このようなもの:

public List<string> GetFilterValues(string columName)
{
    return _db.Logs.Select(l => l.columnName).Distinct.ToList();
}
4

1 に答える 1

5

必要なプロパティを選択する式を取る関数を作成できます。

public List<T> GetLogProperties<T>(Expression<Func<Log, T>> selector)
{
    return _db.Logs.Select(selector).Distinct().ToList();
}

public List<string> GetLevels()
{
    return GetLogProperties(l => l.Level);
}

編集:文字列列からプロジェクションを作成する場合は、自分で式を作成する必要があります:

public List<string> GetFilterValues(string columnName)
{
    var paramExpr = Expression.Parameter(typeof(Log), "l");
    var propExpr = Expression.Property(paramExpr, columnName);
    var lambdaExpr = Expression.Lambda<Func<Log, string>>(propExpr, paramExpr);

    return _db.Logs.Select(lambdaExpr).Distinct().ToList();
}

List<string> levels = GetFilterValues("Level");

指定された名前のプロパティがプロパティでない場合、これは例外をスローすることに注意してくださいstring

于 2012-08-17T11:52:14.360 に答える