2011-06-14 89 views
1

我想在.ToDictionary()将category_code和category_name连接到一个。现在我只发送category_name,但我想要category_name + category_code。可能吗?用lambda表达式连接两个值

public ActionResult Create() 
{ 
    Party party = new Party(); 
    var list = repository.GetCategories() 
     .Select(p => new { p.category_id, p.category_name, p.category_code }) 
     .AsEnumerable() 
     .ToDictionary(m => m.category_id, m => m.category_name); 

    party.categories = new SelectList(list, "Key", "Value", "SelectedValue"); 
    return View(party); 
} 
+0

我敢肯定的'.AsEnumerable()'可以被删除。 – 2011-06-14 14:54:23

回答

2

你为什么要使用.ToDictionary()AsEnumerableSelect与匿名对象,而不是其他更短:

var list = repository 
    .GetCategories() 
    .Select(x => new SelectListItem 
    { 
     Value = x.category_id.ToString(), 
     Text = x.category_name + x.category_code 
    }); 
party.categories = new SelectList(list, "Value", "Text", "SelectedValue"); 

且不说这种东西更好地适应您的映射层。例如,如果你使用的是AutoMapper控制器的动作看起来是这样的:

public ActionResult Create() 
{ 
    var categories = repository.GetCategories(); 
    var categoriesViewModel = Mapper.Map<IEnumerable<Category>, IEnumerable<CategoryViewModel>>(categories); 
    var party = new PartyViewModel 
    { 
     Categories = categoriesViewModel 
    } 
    return View(party); 
} 
+0

因为我想给你一个更好的代表? =) – Niklas 2011-06-14 14:59:36

+0

如果'repository.GetCategories()'返回一个IQueryable,那么在性能方面使用.Select()比使用AutoMapper更好。 – 2011-06-14 15:05:51

+0

另外如果'repository.GetCategories()'从ORM返回一个IQueryable,'x.category_id.ToString()'工作吗? – 2011-06-14 15:06:55

0
.ToDictionary(m => m.category_id, m => string.format("{0}{1}",m.category_name ,m.category_code)); 
+0

我不会打扰使用string.Format的东西这么简单。 – 2011-06-14 14:56:12

+0

@Simon它更容易阅读我猜,它绝对不会伤害。 – 2011-06-14 14:58:19

+0

这并不是比较容易阅读,并且比连接两个字符串要慢。我对string.Format没有任何反应,但这里没有必要。 – 2011-06-14 14:59:51