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

4

15 回答 15

320

使用 EF v4,您可以使用SqlFunctions.StringConvert. int 没有重载,因此您需要转换为双精度或小数。您的代码最终看起来像这样:

var items = from c in contacts
            select new ListItem
            {
                Value = SqlFunctions.StringConvert((double)c.ContactId).Trim(),
                Text = c.Name
            };
于 2010-07-20T17:44:02.340 回答
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 });
}
于 2012-10-29T13:10:12.710 回答
9

使用 LinqToObject :联系人。AsEnumerable()

var items = from c in contacts.AsEnumerable()
            select new ListItem
            {
                Value = c.ContactId.ToString(),
                Text = c.Name
            };
于 2014-01-20T12:57:19.123 回答
5

SqlFunctions.StringConvert 会起作用,但我觉得它很麻烦,而且大多数时候,我并没有真正需要在 SQL 端执行字符串转换。

如果我想做字符串操作,我会首先在 linq-to-entities 中执行查询,然后在 linq-to-objects 中操作字符串。在此示例中,我想获取一组包含联系人全名和 ContactLocationKey 的数据,ContactLocationKey 是两个整数列(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 不支持的字符串(和其他)函数的便利性要重要。另请记住,使用此方法可能会降低性能。

于 2012-01-04T03:42:48.630 回答
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();
            }
        }
于 2011-04-30T11:38:57.690 回答
3
var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
    Text = a.ClassName,
    Value = a.ClassId.ToString()
});

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

于 2012-07-07T12:43:17.093 回答
3

Brian Cauthon 的回答非常好!只是一点点更新,对于 EF 6,该类已移至另一个命名空间。因此,在 EF 6 之前,您应该包括:

System.Data.Objects.SqlClient

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

System.Data.Entity.SqlServer

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

于 2016-12-22T15:34:07.603 回答
2

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

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

GetProducers() 只返回生产者的实体集合。PS SqlFunctions.StringConvert 对我不起作用。

于 2011-06-01T21:50:16.390 回答
2

如果您的“联系人”充当通用列表,我希望以下代码运行良好。

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

谢谢。

于 2012-10-31T13:51:40.997 回答
2

另一种解决方案:

c.ContactId + ""

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

于 2017-07-10T13:25:28.740 回答
1

使用 MySql,SqlFunctions.StringConvert对我不起作用。由于我SelectListItem在我的项目中使用了 20 多个地方,因此我想要一个可以在不扭曲 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(); }
    }
}
于 2014-02-03T02:23:41.383 回答
1

如果您使用实体框架并且想要使唯一的 int 可接受,那么您可以在 linq 查询中使用它,您可以试试这个

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

它会起作用,因为使用 (int) 会将您的值转换为 int,因此您不需要将字符串转换为 int 并且您会得到想要的结果。

这在我的项目中对我有用,我认为这对你有帮助

于 2016-11-21T13:15:09.537 回答
-2

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

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
};
于 2009-07-01T02:48:22.550 回答
-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>

在过去几天的反复试验中,我花了很多时间搜索才能找到这个。

我希望这对那里的一些编码员有所帮助。

于 2012-12-12T10:30:00.577 回答
-6

你能试一下吗:

var items = from c in contacts
        select new ListItem
        {
            Value = Convert.ToString(c.ContactId), 
            Text = c.Name
        };
于 2009-07-01T00:31:30.500 回答