2012-08-17 44 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

相關問題