2009-11-10 2 views
18

Nous avons une classe appelée Tâche:Passage func comme paramètre dans LINQ aux entités et « .NET Framework interne Erreur de fournisseur de données 1025 » erreur

public partial class Task : EntityObject 
{ 
    public EntityCollection<TaskUser> TaskUsers { get {...} set{...} } 
} 

Il a la propriété de navigation appelé TaskUsers, qui contient les utilisateurs attachés à cette par défaut:

public partial class TaskUser : EntityObject 
{ 
    public User User { get {...} set { } } 
} 

Chaque objet TaskUser possède un objet Utilisateur.

IQueryable<Task> tasks. Nous voulons trouver les tâches assignées à l'utilisateur avec ID = 1. Lorsque nous utilisons

tasks.Where(t => t.TaskUsers.Any(a => a.User.ID == 1)) 

tout fonctionne bien. Lorsque nous utilisons

Func<TaskUser, bool> function = a => a.User.ID == 1; 
return tasks.Where(t => t.TaskUsers.Any(function)); 

nous obtenons belle erreur 'Internal .NET Framework Data Provider error 1025'. Pourquoi? Je veux construire des filtres beaucoup plus compliqués en utilisant la classe Expression, mais si je ne peux pas passer le simple Func, cela ne peut pas être fait. Que devrais-je faire?

EDIT

Peut-être

Func<TaskUser, bool> function = a => a.User.ID == 1; 
return tasks.Where(t => t.TaskUsers.Any(function)); 

ne fonctionne pas, mais

Expression<Func<TaskUser, bool>> expression = a => a.User.ID == 1; 
return tasks.Where(t => t.TaskUsers.AsQueryable().Any(expression)); 

œuvres! C'est tout ce dont j'avais besoin.

+0

Heh, je viens de publier une prime sur une [question similaire] (http://stackoverflow.com/questions/11990158/internal- net-framework-data-provider-error-1025), avant de trouver votre solution ici. Tu veux aller chercher la prime? –

+0

En fait, ayant essayé d'utiliser 'Expression' plutôt que' Func', comme vous l'avez fait, le mien n'a pas fonctionné. D'autres idées? –

Répondre

25

Eh bien l'EF ne peut traduire que des expressions, pas des fonctions.

-à-dire qu'il peut traduire:

Expression<Func<TaskUser,bool>> 

mais pas:

Func<TaskUser,bool> 

Quant à la façon de fusionner les expressions (dans le code pseudo):

Expression<Func<TaskUser, bool>> expression = a => a.User.ID == 1; 
return tasks.Where(t => t.TaskUsers.Any(expression)); 

Il y a probablement certains gourous Expression qui peuvent aider avec ça.

Je suggère une question sur ce suivi axé problème particulier

Alex

+12

Sans l'aide du gourou: retour des tâches. Où (t => t.TaskUsers.AsQueryable(). Any (expression)); – LukLed

+0

Cool, toujours demandé. –

Questions connexes