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 });
}

其他回答

Brian Cauthon的回答非常棒!只是一个小更新,对于EF 6,类被移动到另一个名称空间。所以,在EF 6之前,你应该包括:

System.Data.Objects.SqlClient

如果您更新到EF 6,或者只是使用这个版本,请包括:

System.Data.Entity.SqlServer

通过使用EF6包含不正确的名称空间,代码将正常编译,但将抛出运行时错误。我希望这篇笔记有助于避免一些混乱。

使用LinqToObject: contacts.AsEnumerable()

var items = from c in contacts.AsEnumerable()
            select new ListItem
            {
                Value = c.ContactId.ToString(),
                Text = c.Name
            };
var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
    Text = a.ClassName,
    Value = a.ClassId.ToString()
});

首先,转换为对象,然后toString()将是正确的。

还有一个解决方案:

c.ContactId + ""

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

使用MySql, SqlFunctions。StringConvert不适合我。因为我在我的项目中使用SelectListItem在20多个地方,我想要一个解决方案,工作不扭曲20+ LINQ语句。我的解决方案是子类SelectedListItem,以提供一个整数setter,这将类型转换从LINQ。显然,这种解决方案很难概括,但对我的特定项目非常有帮助。

要使用,创建以下类型并在您的LINQ查询中使用SelectedListItem,并使用IntValue代替Value。

public class BtoSelectedListItem : SelectListItem
{
    public int IntValue
    {
        get { return string.IsNullOrEmpty(Value) ? 0 : int.Parse(Value); }
        set { Value = value.ToString(); }
    }
}