Pergunta

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

Existe uma maneira que eu posso conseguir isso? Note, que no VB.NET não há utilização problema o primeiro trecho ele funciona muito grande, VB é flexível, im incapaz de se acostumar com C # 's rigor !!!

Foi útil?

Solução

Com EF v4 você pode usar SqlFunctions.StringConvert . Não há sobrecarga para int então você precisa elenco para um casal ou um decimal. Suas extremidades de código acima de olhar como este:

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

Outras dicas

Eu resolvi um problema semelhante, colocando a conversão do inteiro para string de consulta. Isto pode ser conseguido, colocando a consulta em um objeto.

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

Use LinqToObject:. Contatos AsEnumerable ()

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

SqlFunctions.StringConvert vai funcionar, mas acho que é pesado, e na maioria das vezes, eu não tenho uma necessidade real para executar a conversão de cadeia no lado do SQL.

O que eu faço se eu quiser fazer manipulações de string é realizar a consulta no LINQ para entidades em primeiro lugar, em seguida, manipular as picadas em LINQ-to-objetos. Neste exemplo, eu quero obter um conjunto de dados contendo nome completo de um contato, e ContactLocationKey, que é o concatination série de duas colunas inteiras (ContactID e 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();

Agora, admito que ele faz ficar complicado ter que escrever duas seleciona anônimos, mas eu diria que é superado pela conveniência de que você pode executar funções de cadeia (e outros) não suportados no L2E. Também tenha em mente que há provavelmente uma penalidade de desempenho usando esse método.

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

Em primeiro lugar, convertido ao objeto, em seguida, toString () será correta.

A resposta de Brian Cauthon é excelente! Apenas uma pequena atualização, por EF 6, a classe foi transferida para outro namespace. Então, antes de EF 6, você deve incluir:

System.Data.Objects.SqlClient

Se você atualizar a EF 6, ou simplesmente está usando esta versão, incluem:

System.Data.Entity.SqlServer

Ao incluir o namespace incorreto com EF6, o código irá compilar apenas bom, mas irá lançar um erro de execução. Espero que esta nota ajuda a evitar alguma confusão.

Corri para este mesmo problema quando eu estava convertendo meu aplicativo MVC 2 a MVC 3 e apenas para dar outra solução (limpo) para este problema eu quero postar o que eu fiz ...

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

GetProducers () simplesmente retorna uma coleção entidade de Produtores. P. S. O SqlFunctions.StringConvert não funcionou para mim.

Se o seu "contato" está agindo como lista genérica, espero que o seguinte código funciona bem.

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

Graças.

Usando MySql, o SqlFunctions.StringConvert não funcionou para mim. Desde que eu uso SelectListItem em mais de 20 lugares no meu projeto, eu queria uma solução que trabalho sem contorcendo 20+ instruções LINQ. Meu solução foi SelectedListItem sub-classe, a fim de proporcionar um número inteiro Setter, que se move de conversão do tipo de distância a partir de LINQ. Obviamente, esta solução é difícil generalizar, mas foi bastante útil para o meu projeto específico.

Para usar, crie o seguinte tipo e uso em sua consulta LINQ no lugar de SelectedListItem e usar intValue no lugar de valor.

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

Mais uma solução:

c.ContactId + ""

Basta adicionar string vazia e ele será convertido para string.

Se você usar estrutura de entidade e você quer fazer o único int aceitável, então você pode usar isso em consulta LINQ você pode tentar este

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

isso vai funcionar porque usando (int) vai lançar o seu valor para o int para que você não precisa de qualquer conversão para string para int e você obter o resultado que deseja.

Isso funcionou para mim no meu projeto eu acho que seria útil para você

O meu entendimento é que você tem que criar uma classe parcial "estender" o seu modelo e adicionar uma propriedade que é somente leitura que pode utilizar o resto das propriedades da classe.

public partial class Contact{

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

Em seguida

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

Descobri que SqlFunctions.StringConvert((double)c.Age) não funcionou para mim ou o campo é do tipo Nullable<Int32>

Levei um monte de pesquisa ao longo dos últimos dias de tentativa e erro para encontrar este.

Espero que isso ajude alguns codificadores lá fora.

Você pode tentar:

var items = from c in contacts
        select new ListItem
        {
            Value = Convert.ToString(c.ContactId), 
            Text = c.Name
        };
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top