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)
您可以编写一个函数,该函数使用表达式选择所需的属性:
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属性不是属性,则会引发异常.