var items = from c in contacts
            select new ListItem
            {
                Value = c.ContactId, //Cannot implicitly convert type 'int' (ContactId) to 'string' (Value).
                Text = c.Name
            };
var items = from c in contacts
            select new ListItem
            {
                Value = c.ContactId.ToString(), //Throws exception: ToString is not supported in linq to entities.
                Text = c.Name
            };

有什么办法可以做到吗? 注意,在VB中。NET没有问题,使用第一个代码片段,它的工作只是伟大的,VB是灵活的,我无法习惯c#的严格!!


当前回答

我解决了一个类似的问题,方法是将整数到字符串的转换放在查询之外。这可以通过将查询放入对象来实现。

var items = from c in contacts
            select new 
            {
                Value = c.ContactId,
                Text = c.Name
            };
var itemList = new SelectList();
foreach (var item in items)
{
    itemList.Add(new SelectListItem{ Value = item.ContactId, Text = item.Name });
}

其他回答

public static IEnumerable<SelectListItem> GetCustomerList()
        {
            using (SiteDataContext db = new SiteDataContext())
            {
                var list = from l in db.Customers.AsEnumerable()
                           orderby l.CompanyName
                           select new SelectListItem { Value = l.CustomerID.ToString(), Text = l.CompanyName };

                return list.ToList();
            }
        }

对于EF v4,您可以使用SqlFunctions.StringConvert。int没有重载,所以需要强制转换为双精度或小数。你的代码最终看起来是这样的:

var items = from c in contacts
            select new ListItem
            {
                Value = SqlFunctions.StringConvert((double)c.ContactId).Trim(),
                Text = c.Name
            };

还有一个解决方案:

c.ContactId + ""

只需添加空字符串,它将被转换为字符串。

当我将我的MVC 2应用程序转换为MVC 3时,我遇到了同样的问题,只是为了给这个问题的另一个(干净的)解决方案,我想张贴我所做的…

IEnumerable<SelectListItem> producers = new SelectList(Services.GetProducers(),
    "ID", "Name", model.ProducerID);

GetProducers()只是返回生产者的实体集合。 附注:SqlFunctions。StringConvert不适合我。

如果您的“联系人”是作为通用列表,我希望下面的代码工作良好。

var items = contact.Distinct().OrderBy(c => c.Name)
                              .Select( c => new ListItem
                              {
                                Value = c.ContactId.ToString(),
                                Text = c.Name
                              });

谢谢。