2013-07-24 52 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')一起使用时会抛出一个运行时异常。 –