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 ListItem
        {
            Value = Convert.ToString(c.ContactId), 
            Text = c.Name
        };

其他回答

还有一个解决方案:

c.ContactId + ""

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

你可以试试:

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

SqlFunctions。StringConvert可以工作,但我发现它很麻烦,而且大多数时候,我并不真正需要在SQL端执行字符串转换。

如果我想做字符串操作,我所做的是首先在linq-to-entities中执行查询,然后在linq-to-objects中操作sting。在本例中,我想获得一组数据,其中包含联系人的全名和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中不支持的字符串(和其他)函数的便利性超过了这一点。还要记住,使用这种方法可能会降低性能。

我解决了一个类似的问题,方法是将整数到字符串的转换放在查询之外。这可以通过将查询放入对象来实现。

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

对于EF v4,您可以使用SqlFunctions.StringConvert。int没有重载,所以需要强制转换为双精度或小数。你的代码最终看起来是这样的:

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