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#的严格!!!
答案 0 :(得分:309)
使用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
};
答案 1 :(得分:12)
我通过将整数转换为查询字符串来解决类似的问题。这可以通过将查询放入对象来实现。
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 });
}
答案 2 :(得分:9)
使用LinqToObject:contacts。 AsEnumerable()
var items = from c in contacts.AsEnumerable()
select new ListItem
{
Value = c.ContactId.ToString(),
Text = c.Name
};
答案 3 :(得分:5)
SqlFunctions.StringConvert会起作用,但我发现它很麻烦,而且大多数时候,我并没有真正需要在SQL端执行字符串转换。
如果我想做字符串操作,我首先在linq-to-entities中执行查询,然后在linq-to-objects中操作stings。在这个例子中,我想获得一组包含Contact的全名和ContactLocationKey的数据,ContactLocationKey是两个Integer列(ContactID和LocationID)的字符串连接。
// 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();
现在,我承认必须编写两个匿名选项确实很麻烦,但我认为这可以方便地执行L2E中不支持的字符串(和其他)功能。另请注意,使用此方法可能会降低性能。
答案 4 :(得分:4)
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();
}
}
答案 5 :(得分:3)
var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
Text = a.ClassName,
Value = a.ClassId.ToString()
});
首先,转换为object,然后toString()将是正确的。
答案 6 :(得分:3)
Brian Cauthon的回答很棒!只需稍微更新一下,对于EF 6,该类已移至另一个命名空间。因此,在EF 6之前,您应该包括:
System.Data.Objects.SqlClient
如果您更新到EF 6,或只是使用此版本,请包含:
System.Data.Entity.SqlServer
通过在EF6中包含不正确的命名空间,代码将编译得很好但会引发运行时错误。我希望这个说明有助于避免一些混乱。
答案 7 :(得分:2)
当我将我的MVC 2应用程序转换为MVC 3时,我遇到了同样的问题,只是为了解决这个问题我想发布我做的另一个(干净的)解决方案...
IEnumerable<SelectListItem> producers = new SelectList(Services.GetProducers(),
"ID", "Name", model.ProducerID);
GetProducers()只返回Producers的实体集合。 附: SqlFunctions.StringConvert对我不起作用。
答案 8 :(得分:2)
如果您的“联系人”充当通用列表,我希望以下代码能够正常运行。
var items = contact.Distinct().OrderBy(c => c.Name)
.Select( c => new ListItem
{
Value = c.ContactId.ToString(),
Text = c.Name
});
感谢。
答案 9 :(得分:1)
使用MySql,SqlFunctions.StringConvert
对我不起作用。由于我在项目的20多个位置使用SelectListItem
,因此我想要一个无需扭曲20多个LINQ语句的解决方案。我的解决方案是子类SelectedListItem
以提供整数设置器,它将类型转换从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(); }
}
}
答案 10 :(得分:1)
如果您使用实体框架并且想要使唯一的int可接受,那么您可以在linq查询中使用它,您可以尝试这个
var items = from c in contacts
select new ListItem
{
Value = (int)ContractId
Text = c.Name
};
它将起作用,因为using(int)会将您的值转换为int,因此您不需要将string转换为int,并获得所需的结果。
这在我的项目中对我有用,我认为这对你有帮助
答案 11 :(得分:1)
还有一个解决方案:
c.ContactId + ""
只需添加空字符串,它就会转换为字符串。
答案 12 :(得分:-2)
我的理解是你必须创建一个部分类来“扩展”你的模型,并添加一个可以利用该类其余属性的readonly属性。
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
};
答案 13 :(得分:-2)
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>
在试错的最后几天里,我找了很多搜索来找到这个。
我希望这能帮助一些编码员。
答案 14 :(得分:-6)
你可以尝试:
var items = from c in contacts
select new ListItem
{
Value = Convert.ToString(c.ContactId),
Text = c.Name
};