Problème avec la conversion de int en string dans Linq to entities
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
};
Est-il de toute façon je peux réaliser ceci?
Notons que dans la VB.NET il n'y a aucun problème à utiliser le premier extrait il fonctionne tout simplement génial, VB, il est souple, im incapable de s'habituer à C#rigueur!!!
- .ToString() ne fonctionne pas pour LinqToEF en VB soit. À mon humble avis, Sorte de stupide.
- le problème est avec le ELINQ linq (2 entités), parce qu'il traduit votre code SQL, et quand il s'agit d'un intérieur ToString demande, il ne sait pas comment traduire "ToString" pour SQL. Contrairement à linq 2 objets, lorsqu'il n'y a pas de traduction, et tout est CLR lambdas, alors qu'elle est effectuée directement sur les objets demandés.
- Je suis juste irritée qu'ils permettre ce genre d'erreur à la compilation, et que j'ai eu de troll pour toujours pour trouver une simple description en anglais de la cause (sans juridique-ese et le milieu universitaire-ese).
- Vous avez raison, mais ils sont aussi à droite, ils ne sont pas censés traduire tous le CLR et personnalisé CLR fonctionnalités de SQL, et surtout pas dans la toute première version de EF 🙂 Sur le ToString, lire Brian de réponse: stackoverflow.com/questions/1066760/...
- Super, mais comment les personnes utilisant 3.5, n ° 4? Alors quoi?
- Il semble que la question évidente qui personne n'a demandé c'est pourquoi sur la terre est le ListItem.Valeur (propriété) d'une chaîne et non un int?
- Car ce n'est pas la question qui a été posée.
Vous devez vous connecter pour publier un commentaire.
Avec EF v4 vous pouvez utiliser
SqlFunctions.StringConvert
. Il n'y a pas de surcharge pour les int de sorte que vous besoin de cast pour un double ou d'un décimal. Votre code finit par ressembler à ceci:SqlFunctions.StringConvert
partie de votre question ressemble? À partir de l'erreur, il semble que vous êtes de passage à unNullable<double>
(double?
) au lieu d'undouble
. Essayez d'appelerGetValueOrDefault()
avant de vous le transmettre.SqlFunctions.StringConvert((double)c.ContactId).Trim()
J'ai résolu un problème similaire en plaçant la conversion de l'entier de la chaîne de la requête. Ceci peut être réalisé en mettant la requête dans un objet.
Utilisation LinqToObject : contacts.AsEnumerable()
AsEnumerable
vous devrez payer un prix de haute performance sur les grandes bases de données parce que cela apportera tout en mémoire.IEnumerable
est plus lente en comparaison avecIQueryable
parce que le plus tard est réalisée exclusivement dans la base de données.SqlFunctions.StringConvert de fonctionner, mais je trouve ça lourd, et la plupart du temps, je n'ai pas un réel besoin pour effectuer la conversion de chaîne de caractères sur le SQL côté.
Ce que je fais si je veux faire les manipulations de chaînes, c'est effectuer une requête linq-to-entités d'abord, puis de manipuler les piqûres de linq-to-objets. Dans cet exemple, je veux obtenir un ensemble de données contenant un Contact fullname, et ContactLocationKey, qui est la chaîne concatination de deux colonnes de type Entier (ContactID et LocationID).
Maintenant, je vous l'accorde que c'est lourd d'avoir à écrire deux anonymes sélectionne, mais je dirais que c'est compensé par le confort de laquelle vous pouvez effectuer des cordes (et autres) des fonctions non prises en charge dans L2E. Aussi garder à l'esprit qu'il ya probablement une baisse des performances à l'aide de cette méthode.
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();
. Cette façon de faire n'a que l'id/nom de la db (au lieu de tous à la clientèle propriétés) et le tri à l'aide de l'index plus efficaces sur la db.Tout d'abord, de les convertir en objet, puis toString() sera correct.
Brian Cauthon de réponse est excellent! Juste une petite mise à jour, pour EF 6, la classe s'est déplacé vers un autre espace de noms. Donc, avant de EF 6, vous devez inclure:
Si vous mettez à jour à EF 6, ou tout simplement à l'aide de cette version comprennent:
Par y compris l'espace de noms incorrect avec EF6, le code se compile très bien, mais génèrera une erreur d'exécution. J'espère que cette remarque permet d'éviter une certaine confusion.
J'ai rencontré ce même problème quand j'ai été la conversion de mon MVC 2 app pour MVC 3 et juste pour donner un autre (nettoyer) la solution à ce problème, je tiens à poster ce que j'ai fait...
GetProducers() retourne simplement une entité de collecte de Producteurs.
P. S. Le SqlFunctions.StringConvert ne fonctionne pas pour moi.
Si votre "contact" agissant comme générique de la liste, j'espère que le code suivant fonctionne bien.
Grâce.
La solution:
Juste ajouter une chaîne vide et il sera converti en chaîne de caractères.
De l'utilisation de MySql, la
SqlFunctions.StringConvert
ne fonctionne pas pour moi. Depuis que j'utiliseSelectListItem
dans+ de 20 places dans mon projet, je voulais une solution qui fonctionnent sans contorting 20+ LINQ consolidés. Ma solution a été de sous-classeSelectedListItem
afin de fournir un entier setter, qui se déplace le type de conversion à l'écart de LINQ. Évidemment, cette solution est difficile de généraliser, mais il a été très utile pour mon projet spécifique.D'utiliser, de créer le type suivant et à utiliser dans votre requête LINQ en place de
SelectedListItem
et l'utilisation IntValue à la place de la Valeur.si vous utiliser entity framework et vous souhaitez le faire le seul int acceptable, alors vous pouvez l'utiliser dans une requête linq, vous pouvez essayer ce
cela marchera car à l'aide de (int) sera jeté votre valeur à l'int de sorte que vous n'avez pas besoin de conversion de string en int et vous obtenez le résultat que vous souhaitez.
cela a fonctionné pour moi dans mon projet, je pense qu'il serait utile pour vous
Ma compréhension est que vous devez créer une classe partielle à "étendre" de votre modèle et ajouter une propriété en lecture seule qui peut utiliser le reste de propriétés de la classe.
Puis
J'ai trouvé que
SqlFunctions.StringConvert((double)c.Age)
ne fonctionne pas pour moi non plus le champ est de typeNullable<Int32>
M'a pris beaucoup de recherche au cours de la dernière quelques jours d'essais et erreurs pour trouver ce.
J'espère que cela aide un peu codeurs.
System.String Concat(System.Object)
ne peut pas être traduit dans un magasin d'expression...".Pouvez-vous essayer: