用于从数据库中检索过滤器值的重构方法

Jus*_*der 0 c# refactoring entity-framework linq-to-sql

我正在使用.Net Framework 4,mvc 3和实体框架(最新稳定版)

在索引页面上,我希望能够过滤每一列.LINQ使用distinct()方法为每列检索过滤器值.我没有找到一种很好的方法来重用为每列检索这些值的方法 - 它们基本相同,唯一区分它们的是使用的列名,因此使用一种方法而不是几种方法会很好.

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();
}
Run Code Online (Sandbox Code Playgroud)

如何使用我想从中检索数据的列名注入lambda表达式?像这样的东西:

public List<string> GetFilterValues(string columName)
{
    return _db.Logs.Select(l => l.columnName).Distinct.ToList();
}
Run Code Online (Sandbox Code Playgroud)

Lee*_*Lee 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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果要从字符串列创建投影,则必须自己构建表达式:

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");
Run Code Online (Sandbox Code Playgroud)

请注意,如果具有给定名称的string属性不是属性,则会引发异常.