0

我正在使用 .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();
}

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

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 回答