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 alguma maneira de conseguir isso? Observe que no VB.NET não há problema em usar o primeiro trecho, ele funciona muito bem, o VB é flexível, não consigo me acostumar com o rigor do C # !!!
c#
asp.net
linq-to-entities
tostring
Shimmy Weitzhandler
fonte
fonte
Respostas:
Com o EF v4 você pode usar
SqlFunctions.StringConvert
. Não há sobrecarga para int, então você precisa converter para um dobro ou um decimal. Seu código acaba assim:fonte
SqlFunctions.StringConvert((double)c.ContactId).Trim()
Resolvi um problema semelhante colocando a conversão do número inteiro em string fora da consulta. Isso pode ser alcançado colocando a consulta em um objeto.
fonte
Use LinqToObject: contatos. AsEnumerable ()
fonte
AsEnumerable
, pagará um preço de alto desempenho em bancos de dados maiores, pois trará tudo para a memória.IEnumerable
é mais lento em comparação comIQueryable
porque o posterior é executado exclusivamente no banco de dados.SqlFunctions.StringConvert funcionará, mas acho complicado e, na maioria das vezes, não tenho uma necessidade real de realizar a conversão de string no lado SQL.
O que faço se quiser manipular seqüências de caracteres é executar primeiro a consulta no linq-to-entity e depois manipular as picadas no linq-to-objects. Neste exemplo, desejo obter um conjunto de dados contendo o nome completo de um contato e ContactLocationKey, que é a concatinação de seqüência de caracteres de duas colunas Inteiras (ContactID e LocationID).
Agora, admito que é complicado ter que escrever duas seleções anônimas, mas eu argumentaria que isso é superado pela conveniência de que você pode executar funções de string (e outras) não suportadas no L2E. Lembre-se também de que provavelmente existe uma penalidade de desempenho usando esse método.
fonte
fonte
return list.ToList();
!return (from l in db.Customers orderby l.CompanyName select new {Id=l.CustomerID, Name=l.CompanyName}).AsEnumerable().Select(c=> new SelectListItem{Value=c.Id.ToString(), Text = c.Name}).ToList();
. Fazer dessa maneira obtém apenas o ID / nome do banco de dados (em vez de todas as propriedades do cliente) e faz a classificação usando o índice mais eficiente no banco de dados.Em primeiro lugar, converta em objeto e, em seguida, toString () estará correto.
fonte
A resposta de Brian Cauthon é excelente! Apenas uma pequena atualização, para o EF 6, a classe foi movida para outro espaço para nome. Portanto, antes do EF 6, você deve incluir:
Se você atualizar para o EF 6 ou simplesmente estiver usando esta versão, inclua:
Ao incluir o namespace incorreto no EF6, o código será compilado corretamente, mas gerará um erro de tempo de execução. Espero que esta nota ajude a evitar alguma confusão.
fonte
Encontrei esse mesmo problema ao converter meu aplicativo MVC 2 para MVC 3 e, para fornecer outra solução (limpa) para esse problema, quero postar o que fiz ...
GetProducers () simplesmente retorna uma coleção de entidades de Producers. PS O SqlFunctions.StringConvert não funcionou para mim.
fonte
Se o seu "contato" estiver atuando como lista genérica, espero que o código a seguir funcione bem.
Obrigado.
fonte
Mais uma solução:
Basta adicionar uma string vazia e ela será convertida em string.
fonte
Usando o MySql, o
SqlFunctions.StringConvert
não funcionou para mim. Como eu usoSelectListItem
em mais de 20 lugares no meu projeto, eu queria uma solução que funcionasse sem contorcer as mais de 20 instruções LINQ. Minha solução foi a subclasseSelectedListItem
para fornecer um setter inteiro, que afasta a conversão de tipo do LINQ. Obviamente, esta solução é difícil de generalizar, mas foi bastante útil para o meu projeto específico.Para usar, crie o seguinte tipo e use na sua consulta LINQ no lugar de
SelectedListItem
e use IntValue no lugar de Value.fonte
Se você usa a estrutura de entidade e deseja tornar aceitável o único int, pode usá-lo na consulta linq.
funcionará porque usar (int) converterá seu valor para int, assim você não precisa de nenhuma conversão para string em int e obtém o resultado desejado.
isso funcionou para mim no meu projeto, acho que seria útil para você
fonte
Meu entendimento é que você precisa criar uma classe parcial para "estender" seu modelo e adicionar uma propriedade somente de leitura que possa utilizar o restante das propriedades da classe.
Então
fonte
eu achei aquilo
SqlFunctions.StringConvert((double)c.Age)
não funcionou para mim ou o campo é do tipoNullable<Int32>
Levei muito tempo pesquisando nos últimos dias de tentativa e erro para encontrar isso.
Espero que isso ajude alguns codificadores por aí.
fonte
System.String Concat(System.Object)
não pode ser traduzido em uma expressão de loja ... ".Você pode tentar:
fonte