2012-08-17 45 views
0

检索筛选值重构方法,MVC 3和实体框架(最新的稳定)用于我使用.NET Framework 4从数据库

在一个索引页,我希望能够过滤每列。 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(); 
} 
+1

而是在一个方法做的一切,它会更好,如果你做出这样的属性:'公开名单 GetLevels { {返回_db.Logs.Select(L => l.Level).Distinct() .ToList(); }它会更具可读性。顺便说一句,为什么你想在一种方法中有两个不同的东西?我相信回报价值会有所不同。 – Leri 2012-08-17 11:48:11

+0

@PLB,我同意,它更具可读性。我仍然想知道是否可以将列名注入到表达式中。 – JustAnotherCoder 2012-08-17 11:52:46

+0

是的,它的答案包含解决方案,但如果您使用一个,这意味着每次调用该方法时都必须通过表达式,这似乎不是一个好主意。 – Leri 2012-08-17 12:00:18

回答

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属性。

+0

我更喜欢第一个例子的简单性。 – JustAnotherCoder 2012-08-17 12:07:13

相关问题