J'ai une ligne de code LINQ qui déclenche une exception System.NotSupportedException.Pourquoi la version LINQ de cette boucle foreach lance-t-elle une exception NotSupportedException ("NotSupportedException")?
return unconvertedUrls
.Select(potentialQueryURL => ConvertPotentialQueryURLToSeed(potentialQueryURL))
.Where(id => id > 0)
.ToList();
Le message d'exception est " 'Int32 ConvertPotentialQueryURLToSeed (de SeedsSQLConnector.PotentialQueryURL)' Méthode n'a pas de traduction pris en charge à SQL"
Cependant, la simple conversion à une boucle de foreach fonctionne sans problème.
var result = new List<int>();
foreach (var potentialQueryURL in unconvertedUrls)
{
var id = ConvertPotentialQueryURLToSeed(potentialQueryURL);
if (id > 0)
{
result.Add(id);
}
}
return result;
Qu'est-ce qui ne va pas et pourquoi?
========== ========== EDIT
Odd, un collègue a proposé une autre solution qui fonctionne aussi. Il semble que le LINQ transmettait ConvertPotentialQueryURLToSeed à la base de données! Quoi qu'il en soit, voici l'autre solution, qui consiste à ajouter .ToList() à la déclaration précédente:
var unconvertedUrls = (from url in _DataContext.PotentialQueryURLs
where !convertedUrlIds.Contains(url.Id)
select url).ToList();
return unconvertedUrls
.Select(potentialQueryURL => ConvertPotentialQueryURLToSeed(potentialQueryURL))
.Where(id => id > 0)
.ToList();
Je suppose que vous utilisez EF ou NHibernate, le problème est que l'ORM ne peut pas traduire ce que vous avez entré dans SQL. Que fait votre fonction? Peux-tu nous le montrer? Votre deuxième exemple fonctionne car vous n'interrogez pas la base de données. – mattytommo