À l'aide de ToString() dans les requêtes LINQ?
J'ai écrit une requête LINQ pour remplir une listview, mais il useses l' .La méthode ToString() qui apparetly n'est pas autorisé. Lorsque j'utilise le code ci-dessous j'ai le message d'erreur:
Erreur: LINQ to entities ne reconnaît pas la méthode " du Système.String ToString ()', et cette méthode ne peut pas être traduit dans un magasin expression
Est-il un moyen d'utiliser les méthodes ToString() dans LINQ ou, si cela n'est pas possible, quelle est la solution pour convertir un DateTime de Chaîne de caractères dans la requête. Veuillez nœud qui ReleaseDateName est une chaîne de caractères et ReleaseDate est un DateTime
using (var db = new ReleaseInfo())
{
lvReleaseInfo.DataSource = (from r in db.MediaReleases
join rn in db.ReleaseNames
on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { rn.MediaReleaseID, rn.CultureCodeID }
join plat in db.MediaPlatforms
on new { MediaPlatformID = r.MediaPlatformID, CultureCodeID } equals new { plat.MediaPlatformID, plat.CultureCodeID }
join pub in db.MediaPublishers
on new { MediaPublisherID = r.MediaPublisherID, CultureCodeID } equals new { pub.MediaPublisherID, pub.CultureCodeID }
join c in db.Countries
on new { CountryID = r.CountryID, CultureCodeID } equals new { c.CountryID, c.CultureCodeID }
join rd in db.ReleaseDates
on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { rd.MediaReleaseID, rd.CultureCodeID }
join a in db.AffiliateLinks
on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { a.MediaReleaseID, a.CultureCodeID }
where r.SectionID == SectionID
select new
{
rn.ReleaseTitle,
plat.MediaPlatformName,
pub.MediaPublisherName,
c.CountryName,
ReleaseDate = (rd.ReleaseDate == null ? rd.ReleaseDateName : rd.ReleaseDate.ToString()),
a.AffiliateLinkAddress
}).ToList();
lvReleaseInfo.DataBind();
}
OriginalL'auteur | 2013-05-14
Vous devez vous connecter pour publier un commentaire.
Depuis que vous êtes à la matérialisation de votre requête pour la liste de toute façon, vous pourriez faire la conversion sur le .NET, plutôt que dans les SGBDR, comme ceci:
Depuis le
ToString()
est appelé sur un élément deIEnumerable<T>
, il ne sera plus l'échec. Notez également l'utilisation de??
opérateur à la place de null-vérification? :
conditionnelle.est juste la syntaxe de méthode. C'est le même que lorsque vous utilisez
select
dans la syntaxe de la requête.t => { ... }
est une expression lambda. C'est essentiellement à dire pour chaque élément, nous sélectionnons faire tout ce qui est à droite de la=>
de l'opérateur.Merci, je pensais aussi à seulement convertir en un Proc sur le serveur SQL server, car il est assez complext rejoindre. La conversion d'un Proc serait également me permettre de faire de la logique sur le Serveur SQL server. Y aurait-il un rendement décent de mise à niveau pour aller proc vs votre méthode?
J'en doute, parce que en mémoire la projection porte minimal sur les performances système. Ce ne serait pas le cas s'il avait été une mémoire de filtre, bien que, de sorte que le conseil est spécifique à votre cas, lorsque tous les paramètres de filtrage et d'assemblage est fait sur le SGBDR côté.
Donc, je viens de tester le code que vous avez fourni et chaque nom dans la deuxième sélectionnez donne le message d'erreur "Le nom de XXX n'existe pas dans le contexte actuel. L'erreur disparaît si je déclarer les noms précédemment dans le code, mais je suis en train de lier cela à une ListView pour afficher.
OriginalL'auteur dasblinkenlight
Le problème est que vous ne pouvez pas appeler
ToString()
sur un champ jusqu'à ce qu'il est désérialisé. Donc, plutôt que d'essayer d'appelerToString()
dans la requête, il suffit de le faire sur les résultats par la suite.Dans la base de données de la valeur que vous êtes d'exploitation sur n'a aucune notion de
ToString()
c'est pourquoi vous obtenez l'erreur. La requête peut regarder et se sentir comme code C#, mais gardez à l'esprit que sous les couvertures qui se transforme à une requête SQL comme les autres. Après vous obtenez la liste, vous pouvez écrire une simple requête LINQ pour résoudre le problème.OriginalL'auteur evanmcdonnal