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 selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
    Text = a.ClassName,
    Value = a.ClassId.ToString()
});

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

其他回答

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

使用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(); }
    }
}
var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
    Text = a.ClassName,
    Value = a.ClassId.ToString()
});

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

我的理解是,您必须创建一个局部类来“扩展”您的模型,并添加一个只读属性,以利用类的其余属性。

public partial class Contact{

   public string ContactIdString
   {
      get{ 
            return this.ContactId.ToString();
      }
   } 
}

Then

var items = from c in contacts
select new ListItem
{
    Value = c.ContactIdString, 
    Text = c.Name
};

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

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

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