2009-11-10 2 views
18

Wir haben eine Klasse namens Aufgabe:Passing func als Parameter in Linq to Entities und 'Interne .NET Framework Data Provider Fehler 1025' Fehler

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

Es hat Navigationseigenschaft genannt TaskUsers, die Benutzer dazu angebracht enthält taks:

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

Jedes TaskUser-Objekt hat Benutzerobjekt.

Wir erhalten IQueryable<Task> tasks. Wir wollen Aufgaben zu finden, die Benutzer mit ID = 1 zugeordnet sind. Wenn wir

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

verwenden, funktioniert alles gut. Wenn wir

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

verwenden bekommen wir schöne 'Internal .NET Framework Data Provider error 1025' Fehler. Warum? Ich möchte viel kompliziertere Filter mit Expression Klasse bauen, aber wenn ich nicht einfach Func übergeben kann, kann dies nicht getan werden. Was soll ich machen?

EDIT

Vielleicht

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

nicht funktioniert, aber

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

funktioniert! Das ist alles was ich brauchte.

+0

Heh konzentriert vorschlagen, ich habe gerade gebucht ein Kopfgeld auf einer [ähnlichen Frage] (http://stackoverflow.com/questions/11990158/internal- net-framework-data-provider-error-1025), bevor Sie hier Ihre Lösung finden. Willst du das Kopfgeld ergattern? –

+0

Eigentlich, nachdem ich 'Expression' anstelle von' Func' versucht habe, wie du, meins hat ** nicht ** funktioniert. Irgendwelche anderen Ideen? –

Antwort

25

Nun, die EF kann nur Ausdrücke, nicht Funktionen übersetzen.

dh es kann dies übersetzen:

Expression<Func<TaskUser,bool>> 

aber nicht so:

Func<TaskUser,bool> 

Was, wie Ausdrücke fusionieren (in Pseudocode):

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

Es gibt wahrscheinlich einige Expressionsgurus, die dabei helfen können.

ich eine Followup Frage zu diesem speziellen Problem

Alex

+12

Ohne Hilfe von Guru: Aufgaben zurückgeben.Wohin (t => t.TaskUsers.AsQueryable(). Any (Ausdruck)); – LukLed

+0

Cool, immer gefragt. –

Verwandte Themen