将int转换为Linq中的string到实体的问题

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#的严格!

使用EF v4,您可以使用SqlFunctions.StringConvert 。 int没有重载,所以你需要强制转换为double或decimal。 你的代码看起来像这样:

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

我解决了一个类似的问题,把整数转换为查询string。 这可以通过将查询放入一个对象来实现。

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

使用LinqToObject:contacts。 AsEnumerable()

 var items = from c in contacts.AsEnumerable() select new ListItem { Value = c.ContactId.ToString(), Text = c.Name }; 

SqlFunctions.StringConvert会工作,但我觉得很麻烦,而且大多数时候,我没有真正的需要在SQL端执行string转换。

我做什么,如果我想要做string操作是首先在linq-to-entities中执行查询,然后处理linq-to-objects中的sting。 在这个例子中,我想获得一组数据,包含一个联系人的全名和ContactLocationKey,这是两个Integer列(ContactID和LocationID)的string连接。

 // perform the linq-to-entities query, query execution is triggered by ToArray() var data = (from c in Context.Contacts select new { c.ContactID, c.FullName, c.LocationID }).ToArray(); // at this point, the database has been called and we are working in // linq-to-objects where ToString() is supported // Key2 is an extra example that wouldn't work in linq-to-entities var data2 = (from c in data select new { c.FullName, ContactLocationKey = c.ContactID.ToString() + "." + c.LocationID.ToString(), Key2 = string.Join(".", c.ContactID.ToString(), c.LocationID.ToString()) }).ToArray(); 

现在,我认为必须编写两个匿名select会很麻烦,但是我认为超出L2E中不支持的string(和其他)函数的便利性已经超过了。 另外请记住,使用这种方法可能会有性能损失。

 var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({ Text = a.ClassName, Value = a.ClassId.ToString() }); 

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

我遇到了同样的问题,当我将我的MVC 2应用程序转换为MVC 3,只是给这个问题的另一个(干净的)解决scheme,我想发布我做了什么…

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

GetProducers()只是返回一个实体集合的生产者。 PS SqlFunctions.StringConvert没有为我工作。

如果你的“联系人”是通用列表,我希望下面的代码运行良好。

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

谢谢。

布赖恩Cauthon的答案是非常好的! 只是稍微更新一下,对于EF 6,这个类被移到了另一个名字空间。 所以,在EF 6之前,你应该包括:

 System.Data.Objects.SqlClient 

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

 System.Data.Entity.SqlServer 

通过在EF6中包含不正确的命名空间,代码将会很好地编译,但会引发运行时错误。 我希望这个说明有助于避免一些混淆。

使用MySql, SqlFunctions.StringConvert没有为我工作。 由于我在我的项目中有超过20个地方使用了SelectListItem ,所以我想要一个解决scheme,而不会扭曲20多个LINQ语句。 我的解决scheme是子类SelectedListItem为了提供一个整数设置器,从LINQ移动types转换。 显然,这个解决scheme很难概括,但是对我的具体项目来说是相当有帮助的。

要使用,请创build以下types,并在您的LINQ查询中使用SelectedListItem并使用IntValue代替Value。

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

另一个解决scheme:

 c.ContactId + "" 

只需添加空string,它将被转换为string。

最简单的方法是:

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

如果你使用entity framework,你想使唯一的int可以接受,那么你可以在linq查询中使用这个,你可以试试这个

 var items = from c in contacts select new ListItem { Value = (int)ContractId Text = c.Name }; 

这在我的项目中为我工作,我认为这会对你有所帮助

我的理解是,你必须创build一个部分类来“扩展”你的模型,并添加一个只读的属性,可以利用类的其他属性。

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

然后

 var items = from c in contacts select new ListItem { Value = c.ContactIdString, Text = c.Name }; 
 var items = from c in contacts select new ListItem { Value = String.Concat(c.ContactId), //This Works in Linq to Entity! Text = c.Name }; 

我发现SqlFunctions.StringConvert((double)c.Age)不适用于我的字段是Nullable<Int32>typesNullable<Int32>

在试用和错误的最后几天,我花了很多search来find这个。

我希望这可以帮助几个编码器。

你可以尝试:

 var items = from c in contacts select new ListItem { Value = Convert.ToString(c.ContactId), Text = c.Name };