LINQ to entities ne reconnaît pas la méthode " du Système.Linq.IQueryable`
Je veux exécuter ce LINQ simple code pour avoir de numéro d'enregistrement dans LINQ, mais le résultat est en dessous d'erreur
var model = _db2.Persons.Select(
(x, index) => new
{
rn = index + 1,
col1 = x.Id
}).ToList();
Erreur:
LINQ to entities ne reconnaît pas la méthode
'Système.Linq.IQueryable1[<>f__AnonymousType2
2
[Système.Int32,Système.Int32]], Sélectionnez[Personne,<>f__AnonymousType22](System.Linq.IQueryable
1
[MvcApplication27.Modèles.Personne], Système.Linq.Les Expressions.Expression1[System.Func
3
[MvcApplication27.Modèles.Personne,D'Un Système.Int32,<>f__AnonymousType2`2
[Système.Int32,Système.Int32]]]) " la méthode, et cette méthode ne peut pas être traduit dans un magasin
expression.
ressemble
Non, c'est parce que de l'index pour trouver le nombre record. C'est le Premier Code et je n'ai aucun problème lorsque je supprime indice lambda!
Comme une note de votre titre
Persons
n'est pas IQueryable
, essayez d'utiliser Cast
ou OfType
(bien sûr, si elles sont présentes).Non, c'est parce que de l'index pour trouver le nombre record. C'est le Premier Code et je n'ai aucun problème lorsque je supprime indice lambda!
Comme une note de votre titre
System.Linq.IQueryable
est le type de retour, pas le nom de la méthode. Les trucs que vous voyez dans les crochets ([<>f__AnonymousType22 [System.Int32,System.Int32]]
) est le genre de chose qui serait dans le <int, f__AnonymousType22<>>
si vous tapez. La fonction réelle est après cette section Select[Person,<>f_AnonymousType22](...)
.OriginalL'auteur ehsan | 2013-09-13
Vous devez vous connecter pour publier un commentaire.
Le problème est que LINQ to entities ne comprend pas comment les convertir
Select
surcharge (celui qui vous donne l'index) dans une requête SQL. Vous pouvez résoudre ce problème en sélectionnant d'abord la partie de la bd dont vous avez besoin (pour éviter de sélectionner toutes les colonnes inutilement), puis de le faireAsEnumerable()
à prendre comme uneIEnumerable<T>
au lieu d'uneIQueryable<T>
, et ensuite de faire leSelect
purement en C# (en bref,IQueryable<T>
s sont convertis SQL, tandis queIEnumerable<T>
sont exécutés dans le code).Notez que la requête que vous avez, il semble être non ordonnée, de sorte que l'id/index paires peuvent changer chaque fois que vous appelez. Si vous avez prévu de cohérence, il vous faut commander par quelque chose (par exemple
_db2.Persons.OrderBy(...)
).Modifier
L'ajout de commentaire de Scott:
Ne pensez-vous pas que 2 sélectionner(select().AsEnumerable().Sélectionnez()) cause de réduire l'efficacité de comparer avec l'égalité des simple 1 instruction SQL?
oui il fait, mais vous ne pouvez pas utiliser le
Select<T, int>(...)
fonction avec Entity framework. Vous aurez besoin d'utiliser le la Syntaxe de la Requêtelet
ou utiliser une méthode compliquée de syntaxe que ce que vous avez (qui, je pense, serait de diminuer considérablement la lisibilité)Pour ajouter à ce que @ScottChamberlain dit, le plus gros problème de performance ici est d'e/S avec la DB. Depuis, nous avons tenu à un minimum en sélectionnant uniquement la
Id
, la performance devrait être pratiquement la même que la meilleure possible LINQ to entities solution.OriginalL'auteur Tim S.
Vous pouvez simplement sélectionner l'Id et après avoir créer votre propre objet anonyme à l'aide de linq to objects, pour l'échantillon:
C'est probablement se produire en raison d'Entity Framework ne prend pas en charge ce type de requête à l'aide de linq comme linq pourrait le faire en mémoire, donc, dans ce cas, vous pouvez sélectionner seulement vous avez besoin (
id
dans votre cas) et de l'exécuter, à l'aide deToList()
méthode pour concrétiser votre requête et après cela, vous aurez une liste sur la mémoire, vous pouvez donc utiliser linq to objects et l'utilisation de la méthode de prise en charge que vous le souhaitez.AsEnumerable()
dans le milieu. Vous aurez un moinsList()
Il serait bien si vous l'avez expliqué pourquoi vous avez besoin de le faire. (Je tente de poster mon propre réponse en disant quelque chose de similaire, mais je me suis accroché sur la façon d'expliquer pourquoi ce qui se passe pour quelqu'un qui est nouveau à EF)
OriginalL'auteur Felipe Oriani