58 votes

Erreur 1025 du fournisseur de données .NET Framework interne

 IQueryable<Organization> query = context.Organizations;

Func<Reservation, bool> predicate = r => !r.IsDeleted;

query.Select(o => new { 
    Reservations = o.Reservations.Where(predicate)
}).ToList();
 

cette requête lève une exception interne "erreur 1025" du fournisseur de données .NET Framework, mais pas la requête ci-dessous.

 query.Select(o => new { 
    Reservations = o.Reservations.Where( r => !r.IsDeleted)
}).ToList();
 

Je dois utiliser le premier car je dois vérifier quelques instructions if pour construire le prédicat droit. Je sais que je ne peux pas utiliser si des déclarations dans cette circonstance, c’est pourquoi je passe délégué en tant que paramètre.

Comment puis-je le faire fonctionner première requête?

48voto

yo hal Points 1949

Alors que les réponses ci-dessus sont remplies, notez que lorsque vous essayez de l'utiliser après une instruction select a appeler AsQueryable() explicitement, sinon le compilateur suppose que nous essayons d'utiliser les méthodes IEnumerable, qui s'attendent à un Func et pas Expression<Func>.

C'est sans doute la question de l'origine de l'affiche, sinon le compilateur va se plaindre, la plupart du temps qu'il est à la recherche d' Expression<Func> et pas Func.

Démo: Le suivant ne fonctionne pas:

MyContext.MySet.Where(m => m.SubCollection.Select(s => s.SubItem).Any(expr)).Load()

Tandis que le suivant sera de travailler:

MyContext.MySet.Where(m => 
      m.SubCollection.Select(s => s.SubItem).AsQueryable().Any(expr))
         .Load()

26voto

Shaul Points 8267

Après la création de la bounty (rats!), J'ai trouvé cette réponsequi a résolu mon problème. (Mon problème, un .Any() appel, ce qui est un peu plus compliqué que cette question...)

En bref, voici votre réponse:

IQueryable<Organization> query = context.Organizations;

Expression<Func<Reservation, bool>> expr = r => !r.IsDeleted;

query.Select(o => new { Reservations = o.Reservations.Where(expr) })
  .ToList();

Lire référencé dans la réponse pour une explication de pourquoi vous avez besoin de la variable locale expr, et vous ne pouvez pas faire directement référence à une autre méthode de type de retour Expression<Func<Reservation, bool>>.

21voto

Patryk Ćwiek Points 6283

Merci pour le ping-moi. Je suppose que j'étais sur la bonne voie, après tout.

De toute façon, pour réitérer, LINQ to entities (merci à Jon Skeet pour corriger moi quand je me suis mélangé dans ma propre processus de pensée dans les commentaires) opère sur des Arbres d'Expression; elle permet de faire une projection pour traduire l'expression lambda pour SQL par l' QueryProvider.

Régulières Func<> fonctionne bien pour LINQ to Objects.

Donc, dans ce cas, lorsque vous êtes en utilisant Entity Framework, tout prédicat passé à l'EF de l' IQueryable doit être l' Expression<Func<>>.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X