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