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-t-il de toute façon que je peux y parvenir? Notez que dans VB.NET, il n'y a aucun problème, utilisez le premier extrait, cela fonctionne très bien, VB est flexible, je ne peux pas m'habituer à la rigueur de C # !!!
c#
asp.net
linq-to-entities
tostring
Shimmy Weitzhandler
la source
la source
Réponses:
Avec EF v4, vous pouvez utiliser
SqlFunctions.StringConvert
. Il n'y a pas de surcharge pour int, vous devez donc effectuer un cast en double ou en décimal. Votre code finit par ressembler à ceci:la source
SqlFunctions.StringConvert((double)c.ContactId).Trim()
J'ai résolu un problème similaire en plaçant la conversion de l'entier en chaîne hors de la requête. Cela peut être réalisé en plaçant la requête dans un objet.
la source
Utilisez LinqToObject: contacts. AsEnumerable ()
la source
AsEnumerable
vous paierez un prix élevé sur les bases de données plus volumineuses, car cela mettra tout en mémoire.IEnumerable
est plus lent par rapport àIQueryable
parce que le dernier est exécuté exclusivement dans la base de données.SqlFunctions.StringConvert fonctionnera, mais je trouve cela lourd, et la plupart du temps, je n'ai pas vraiment besoin d'effectuer la conversion de chaîne du côté SQL.
Ce que je fais si je veux faire des manipulations de chaînes, c'est d'abord exécuter la requête dans linq-to-entity, puis manipuler les piqûres dans linq-to-objects. Dans cet exemple, je veux obtenir un ensemble de données contenant le nom complet d'un contact et ContactLocationKey, qui est la concatination de chaîne de deux colonnes entières (ContactID et LocationID).
Maintenant, je reconnais que cela devient pénible d'avoir à écrire deux sélections anonymes, mais je dirais que cela est contrebalancé par la commodité dont vous pouvez effectuer des fonctions de chaîne (et autres) non prises en charge dans L2E. Gardez également à l'esprit qu'il y a probablement une baisse des performances en utilisant cette méthode.
la source
la source
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();
. Le faire de cette façon obtient uniquement l'id / nom de la base de données (au lieu de toutes les propriétés du client) et effectue le tri en utilisant l'index le plus efficace sur la base de données.Tout d'abord, convertissez en objet, puis toString () sera correct.
la source
La réponse de Brian Cauthon est excellente! Juste une petite mise à jour, pour EF 6, la classe a été déplacée vers un autre espace de noms. Donc, avant EF 6, vous devez inclure:
Si vous mettez à jour vers EF 6, ou utilisez simplement cette version, incluez:
En incluant l'espace de noms incorrect avec EF6, le code se compilera très bien mais générera une erreur d'exécution. J'espère que cette note aide à éviter une certaine confusion.
la source
J'ai rencontré ce même problème lorsque je convertissais mon application MVC 2 en MVC 3 et juste pour donner une autre solution (propre) à ce problème, je veux publier ce que j'ai fait ...
GetProducers () renvoie simplement une collection d'entités de producteurs. PS Le SqlFunctions.StringConvert n'a pas fonctionné pour moi.
la source
Si votre "contact" fait office de liste générique, j'espère que le code suivant fonctionne bien.
Merci.
la source
Encore une solution:
Ajoutez simplement une chaîne vide et elle sera convertie en chaîne.
la source
Avec MySql, cela
SqlFunctions.StringConvert
n'a pas fonctionné pour moi. Depuis que j'utiliseSelectListItem
dans plus de 20 endroits dans mon projet, je voulais une solution qui fonctionne sans dénaturer les 20+ instructions LINQ. Ma solution était de sous-classerSelectedListItem
afin de fournir un setter entier, qui éloigne la conversion de type de LINQ. Évidemment, cette solution est difficile à généraliser, mais était très utile pour mon projet spécifique.Pour l'utiliser, créez le type suivant et utilisez-le dans votre requête LINQ à la place de
SelectedListItem
et utilisez IntValue à la place de Value.la source
si vous utilisez le framework d'entité et que vous souhaitez rendre le seul int acceptable, vous pouvez l'utiliser dans la requête linq, vous pouvez essayer ceci
cela fonctionnera parce que l'utilisation de (int) convertira votre valeur en int, vous n'avez donc pas besoin de conversion pour la chaîne en int et vous obtenez le résultat souhaité.
cela a fonctionné pour moi dans mon projet, je pense qu'il serait utile pour vous
la source
Ma compréhension est que vous devez créer une classe partielle pour "étendre" votre modèle et ajouter une propriété en lecture seule qui peut utiliser le reste des propriétés de la classe.
ensuite
la source
J'ai trouvé que ça
SqlFunctions.StringConvert((double)c.Age)
ne fonctionnait pas pour moi non plus le champ est de typeNullable<Int32>
Cela m'a pris beaucoup de recherches au cours des derniers jours d'essais et d'erreurs pour trouver cela.
J'espère que cela aide quelques codeurs.
la source
System.String Concat(System.Object)
ne peut pas être traduit en une expression de magasin ... ".Peux-tu essayer:
la source