2013-07-24 94 views
1

我想建立一個委託:各種數據類型訂貨代表

switch(vm.OrderBy){ 
      case "Title": 
       vm.Albums = _albumRepo.Get(a => a.Title); 
       break; 
      case "Artist": 
       vm.Albums = _albumRepo.Get(a => a.Artist.Name); 
       break; 
      case "Price": 
       vm.Albums = _albumRepo.Get(a => a.Price); 
       break; 

我的資料庫的方法是:

​​

所以,我通過Func<Album, string>我Get()方法,只要排序屬性的類型爲String,它就很好。然而,價格是一個小數,所以這不會編譯:

_albumRepo.Get(a => a.Price); 

我需要創建另一個Get方法,這樣我可以用小數訂購?

public IEnumerable<Album> Get(Func<Album, decimal> orderingDelegate = null){ } 

或者是否有更好的方法來做到這一點?

謝謝!

克里斯

回答

3

您可以更改簽名是通用?

public IEnumerable<Album> Get<T>(Func<Album, T> orderingDelegate = null) 
{ 
    IEnumerable<Album> albums; 

    if (orderingDelegate == null) 
     albums = _context.Albums.OrderBy(a => a.Title); 
    else 
     albums = _context.Albums.OrderBy(orderingDelegate); 

    return albums; 
} 
+0

我可以。當我必須在沒有委託的情況下調用Get()時有點尷尬 - 獲取() - 但它肯定是比我更好的解決方案。 –

1

你可以做簡單的解決方案:

public IEnumerable<Album> Get(Func<Album, object> orderingDelegate) 
{ 
    return _context.Albums.OrderBy(orderingDelegate); 
} 
+0

太棒了!我不知道這是如何工作的,但我會接受!謝謝。 –

+0

我非常確定,由於拳擊操作的進行,這將不適用於許多LINQ提供者。我假設它在與一個值類型的屬性(如'int')一起使用時會拋出一個運行時異常。 –